<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Models\DriverGroup;
use App\Services\TripService;
use App\Support\ApiResponder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class GroupHallController extends Controller
{
    use ApiResponder;

    public function directory(): JsonResponse
    {
        return $this->ok(DriverGroup::query()->where('is_active', true)->orderBy('name')->get(['public_id', 'name', 'description', 'operating_area', 'logo_path']));
    }

    public function driverDirectory(Request $request): JsonResponse
    {
        $driver = $request->user()->driver;
        abort_unless($driver && $driver->status->value === 'active', 403);
        $statuses = \App\Models\DriverGroupMembership::query()
            ->where('driver_id', $driver->id)->pluck('status', 'group_id');
        $groups = DriverGroup::query()->where('is_active', true)->orderBy('name')->get();

        return $this->ok($groups->map(fn (DriverGroup $group) => [
            'public_id' => $group->public_id,
            'name' => $group->name,
            'description' => $group->description,
            'operating_area' => $group->operating_area,
            'logo_url' => $group->logo_url,
            'membership_status' => $statuses[$group->id] ?? null,
        ]));
    }

    public function join(Request $request, string $publicId): JsonResponse
    {
        $driver = $request->user()->driver;
        abort_unless($driver && $driver->status->value === 'active', 403);
        $group = DriverGroup::query()->where('public_id', $publicId)->where('is_active', true)->firstOrFail();
        $membership = [
            'role' => 'driver', 'status' => 'pending', 'joined_at' => now(), 'approved_at' => null,
        ];
        if ($driver->groups()->whereKey($group->id)->exists()) {
            $existing = $driver->groups()->whereKey($group->id)->first();
            if ($existing?->pivot?->status !== 'approved') {
                $driver->groups()->updateExistingPivot($group->id, $membership);
            }
        } else {
            $driver->groups()->attach($group->id, $membership);
        }

        return $this->ok(null, 'Membership request sent. A web administrator must approve it.');
    }

    public function mine(Request $request, TripService $trips): JsonResponse
    {
        $driver = $request->user()->driver;
        abort_unless($driver, 403);

        $groups = $driver->groups()
            ->where('driver_groups.is_active', true)
            ->wherePivot('status', 'approved')
            ->with('announcements')
            ->orderBy('driver_groups.name')
            ->get();

        $available = $trips->available($driver)->getCollection();

        return $this->ok($groups->map(fn (DriverGroup $group) => $this->groupPayload(
            $group,
            $available->where('driver_group_id', $group->id)->count() + $group->routes()->where('is_active', true)->count(),
        )));
    }

    public function hall(Request $request, string $publicId, TripService $trips): JsonResponse
    {
        $driver = $request->user()->driver;
        abort_unless($driver, 403);
        $group = $driver->groups()
            ->where('driver_groups.public_id', $publicId)
            ->where('driver_groups.is_active', true)
            ->wherePivot('status', 'approved')
            ->with('announcements')
            ->firstOrFail();

        $orders = $trips->available($driver)->getCollection()
            ->where('driver_group_id', $group->id)
            ->values();

        return $this->ok([
            'group' => $this->groupPayload($group, $orders->count() + $group->routes()->where('is_active', true)->count()),
            'orders' => $orders,
            'routes' => $group->routes()->where('is_active', true)->get(),
        ]);
    }

    private function groupPayload(DriverGroup $group, int $openRequestCount = 0): array
    {
        return [
            'public_id' => $group->public_id,
            'name' => $group->name,
            'logo_url' => $group->logo_url,
            'description' => $group->description,
            'operating_area' => $group->operating_area,
            'pinned_rules' => $group->pinned_rules,
            'open_request_count' => $openRequestCount,
            'started_route_fee_mmk' => $group->started_route_fee_mmk,
            'waiting_fee_per_minute_mmk' => $group->waiting_fee_per_minute_mmk,
            'cost_per_kilometer_mmk' => $group->cost_per_kilometer_mmk,
            'airport_extra_mmk' => $group->airport_extra_mmk,
            'highway_bus_center_extra_mmk' => $group->highway_bus_center_extra_mmk,
            'announcements' => $group->announcements->take(10)->values(),
        ];
    }
}
