<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\City;
use App\Models\Country;
use App\Models\State;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

class ShippingController extends Controller
{
    public function countries(): JsonResponse
    {
        $countries = Cache::remember('shipping:countries:active', 86400, function () {
            return Country::active()
                ->orderBy('name')
                ->get(['id', 'name', 'code']);
        });

        return response()->json([
            'success' => true,
            'data' => $countries,
        ]);
    }

    public function states(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'country_id' => 'required|integer|exists:countries,id,status,1',
        ]);

        $countryId = (int) $validated['country_id'];
        $cacheKey = "shipping:states:{$countryId}";

        $states = Cache::remember($cacheKey, 86400, function () use ($countryId) {
            return State::active()
                ->where('country_id', $countryId)
                ->orderBy('name')
                ->get(['id', 'name', 'country_id']);
        });

        return response()->json([
            'success' => true,
            'data' => $states,
        ]);
    }

    public function cities(Request $request): JsonResponse
    {
        $validated = $request->validate([
            'state_id' => 'required|integer|exists:states,id',
        ]);

        $stateId = (int) $validated['state_id'];
        $cacheKey = "shipping:cities:{$stateId}";

        $cities = Cache::remember($cacheKey, 86400, function () use ($stateId) {
            return City::active()
                ->where('state_id', $stateId)
                ->orderBy('name')
                ->get(['id', 'name', 'state_id', 'country_id']);
        });

        return response()->json([
            'success' => true,
            'data' => $cities,
        ]);
    }
}
