<?php

namespace App\Http\Controllers\Wilayah;

use App\Http\Controllers\ApiController;
use App\Http\Requests\Wilayah\AlamatLengkapRequest;
use App\Http\Requests\Wilayah\IndexWilayahRequest;
use App\Http\Requests\Wilayah\LookupWilayahRequest;
use App\Http\Requests\Wilayah\StoreWilayahRequest;
use App\Http\Requests\Wilayah\UpdateWilayahRequest;
use App\Http\Resources\Wilayah\WilayahResource;
use App\Models\WilayahKabupaten;
use App\Models\WilayahKecamatan;
use App\Models\WilayahProvinsi;
use App\Services\Wilayah\WilayahService;

class WilayahController extends ApiController
{
    public function __construct(protected WilayahService $service) {}

    public function index(IndexWilayahRequest $request, string $tingkat)
    {
        return $this->successPaginated(
            $this->service->list($tingkat, $request->validated()),
            WilayahResource::class,
            "Daftar {$tingkat} berhasil diambil"
        );
    }

    public function store(StoreWilayahRequest $request, string $tingkat)
    {
        return $this->created(
            new WilayahResource($this->service->create($tingkat, $request->validated())),
            ucfirst($tingkat).' berhasil dibuat'
        );
    }

    public function show(int $wilayah, string $tingkat)
    {
        return $this->success(
            new WilayahResource($this->service->find($tingkat, $wilayah)),
            'Detail wilayah berhasil diambil'
        );
    }

    public function update(UpdateWilayahRequest $request, int $wilayah, string $tingkat)
    {
        return $this->updated(
            new WilayahResource($this->service->update($tingkat, $wilayah, $request->validated())),
            ucfirst($tingkat).' berhasil diperbarui'
        );
    }

    public function destroy(int $wilayah, string $tingkat)
    {
        $this->service->delete($tingkat, $wilayah);

        return $this->deleted(ucfirst($tingkat).' berhasil dihapus');
    }

    public function alamatLengkap(AlamatLengkapRequest $request)
    {
        return $this->success(
            $this->service->alamatLengkap($request->validated()),
            'Alamat wilayah lengkap berhasil diambil'
        );
    }

    public function provinsiOptions(LookupWilayahRequest $request)
    {
        return $this->success(
            $this->service->options('provinsi', $request->validated()),
            'Pilihan provinsi berhasil diambil'
        );
    }

    public function kabupatenOptions(
        LookupWilayahRequest $request,
        WilayahProvinsi $provinsi
    ) {
        return $this->success(
            $this->service->options('kabupaten', $request->validated(), $provinsi->id),
            'Pilihan kabupaten berhasil diambil'
        );
    }

    public function kecamatanOptions(
        LookupWilayahRequest $request,
        WilayahKabupaten $kabupaten
    ) {
        return $this->success(
            $this->service->options('kecamatan', $request->validated(), $kabupaten->id),
            'Pilihan kecamatan berhasil diambil'
        );
    }

    public function desaOptions(
        LookupWilayahRequest $request,
        WilayahKecamatan $kecamatan
    ) {
        return $this->success(
            $this->service->options('desa', $request->validated(), $kecamatan->id),
            'Pilihan desa berhasil diambil'
        );
    }
}
