<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\StoreShippingCityRequest;
use App\Models\City;
use App\Models\Country;
use App\Models\State;
use App\Services\AddressCityResolver;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

class ShippingCityController extends Controller
{
    public function __construct(
        protected AddressCityResolver $cityResolver,
    ) {
    }

    public function index(Request $request)
    {
        $countries = Country::active()->orderBy('name')->get(['id', 'name']);
        $states = State::when($request->filled('country_id'), function ($q) use ($request) {
            $q->where('country_id', $request->integer('country_id'));
        })->orderBy('name')->get(['id', 'name', 'country_id']);

        $query = City::with(['state', 'country']);

        if ($request->filled('search')) {
            $search = $request->string('search')->trim();
            $query->where('name', 'like', "%{$search}%");
        }

        if ($request->filled('country_id')) {
            $query->where('country_id', $request->integer('country_id'));
        }

        if ($request->filled('state_id')) {
            $query->where('state_id', $request->integer('state_id'));
        }

        if ($request->filled('status')) {
            $query->where('status', $request->boolean('status'));
        }

        if ($request->filled('source')) {
            $query->where('source', $request->string('source')->toString());
        }

        $cities = $query
            ->orderByDesc('status')
            ->orderBy('name')
            ->paginate(25)
            ->withQueryString();

        return view('admin.shipping.cities.index', [
            'cities' => $cities,
            'countries' => $countries,
            'states' => $states,
            'search' => $request->input('search', ''),
            'countryId' => $request->input('country_id', ''),
            'stateId' => $request->input('state_id', ''),
            'status' => $request->input('status', ''),
            'source' => $request->input('source', ''),
        ]);
    }

    public function store(StoreShippingCityRequest $request): RedirectResponse
    {
        $data = $request->validated();

        $this->cityResolver->resolve(
            cityId: null,
            customName: $data['name'],
            stateId: (int) $data['state_id'],
            countryId: (int) $data['country_id'],
            userId: $request->user()->id,
            source: AddressCityResolver::SOURCE_SEED,
            cost: isset($data['cost']) ? (float) $data['cost'] : 0,
            status: $request->boolean('status', true),
        );

        return redirect()
            ->route('admin.settings.shipping.cities', [
                'country_id' => $data['country_id'],
                'state_id' => $data['state_id'],
            ])
            ->with('success', 'City added successfully.');
    }

    public function updateStatus(Request $request, City $city): RedirectResponse
    {
        $validated = $request->validate([
            'status' => 'required|boolean',
        ]);

        $city->update(['status' => (bool) $validated['status']]);

        return back()->with('success', 'City status updated.');
    }
}
