<?php

namespace App\Http\Controllers\Web\Master;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Wilayah\Provinsi;
use App\Models\Wilayah\KabupatenKota;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class KabupatenKotaController extends Controller
{
    public function index(Request $request)
    {
        $title = 'Master Kabupaten/Kota';
        $perPage = $request->query('per_page', 10);
        $search = $request->query('search', '');

        $provinsi = Provinsi::all(); 

        $kabupatenkota = KabupatenKota::with('provinsi')
            ->where('nama', 'like', "%$search%")
            ->orWhere('kode', 'like', "%$search%")
            ->orWhereHas('provinsi', function($query) use ($search) {
                $query->where('nama', 'like', "%$search%");
            })
            ->orderBy('kode', 'asc')
            ->paginate($perPage);

        return view('master.kabupatenkota.index', compact('title', 'kabupatenkota', 'provinsi'));
    }

    public function getByProvinsi($provinsi_id)
    {
        $kabupaten = KabupatenKota::where('provinsi_id', $provinsi_id)
            ->orderBy('nama', 'asc')
            ->get();
            
        return response()->json($kabupaten);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'kode' => ['required', 'max:4', 'min:4', 'unique:master_kabupaten_kota,kode'],
            'nama' => ['required'],
            'path' => ['nullable'],
            'provinsi_id' => ['required', 'exists:master_provinsi,id']
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status' => 'error',
                'message' => 'Terdapat kesalahan pada input Anda.',
                'errors' => $validator->errors()
            ], 422);
        }

        KabupatenKota::create([
            'kode'          => $request->kode,
            'nama'          => $request->nama,
            'path'          => $request->path,
            'provinsi_id'   => $request->provinsi_id,
            'created_by'    => auth()->id(),
            'updated_by'    => auth()->id(),
        ]);

        return response()->json([
            'status' => 'success', 
            'message' => 'Kabupaten/Kota berhasil ditambahkan.'
        ]);
    }

    public function view($id)
    {
        $kabupatenKota = KabupatenKota::with('provinsi:id,nama')
            ->find($id);

        if (!$kabupatenKota) {
            return response()->json([
                'status'  => 'error',
                'message' => 'Data tidak ditemukan'
            ], 404);
        }

        return response()->json([
            'status' => 'success',
            'data'   => [
                'id'            => $kabupatenKota->id,
                'kode'          => $kabupatenKota->kode,
                'nama'          => $kabupatenKota->nama,
                'path'          => $kabupatenKota->path,
                'provinsi_id'   => $kabupatenKota->provinsi_id,
                'nama_provinsi' => $kabupatenKota->provinsi->nama
            ]
        ]);
    }

    public function update(Request $request, $id)
    {
        $validator = Validator::make($request->all(), [
            'kode'        => ['required', 'max:4', 'min:4', "unique:master_kabupaten_kota,kode,$id"],
            'nama'        => ['required'],
            'path'        => ['nullable'],
            'provinsi_id' => ['required', 'exists:master_provinsi,id']
        ]);

        if ($validator->fails()) {
            return response()->json([
                'status'  => 'error',
                'message' => 'Validasi gagal',
                'errors'  => $validator->errors()
            ], 422);
        }

        $kabupatenKota = KabupatenKota::find($id);
        
        if (!$kabupatenKota) {
            return response()->json(['status' => 'error', 'message' => 'Data tidak ditemukan'], 404);
        }

        $kabupatenKota->update([
            'kode'          => $request->kode,
            'nama'          => $request->nama,
            'path'          => $request->path,
            'provinsi_id'   => $request->provinsi_id,
            'updated_by'    => auth()->id(),
        ]);

        return response()->json(['status' => 'success', 'message' => 'Data berhasil diperbarui!']);
    }

    public function destroy($id)
    {
        $kabupatenKota = KabupatenKota::find($id);
        if (!$kabupatenKota) {
            return response()->json([
                'status'  => 'error',
                'message' => 'Data tidak ditemukan.'
            ], 404);
        }

        $kabupatenKota->deleted_by = auth()->user()->id;
        $kabupatenKota->save();
        $kabupatenKota->delete();

        return response()->json([
            'status'  => 'success',
            'message' => 'Data kabupaten/kota berhasil dihapus.'
        ]);
    }
}
