<?php

namespace App\Http\Controllers\Web\Master;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Wilayah\DesaKelurahan;
use App\Models\Wilayah\Provinsi;
use Illuminate\Support\Facades\Validator;

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

        $provinsi = Provinsi::orderBy('kode', 'asc')->get();

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

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

    public function getByKecamatan($kecamatan_id)
    {
        $desa = DesaKelurahan::where('kecamatan_id', $kecamatan_id)
            ->orderBy('nama', 'asc')
            ->get();
            
        return response()->json($desa);
    }

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

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

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

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

    public function view($id)
    {
        $desakelurahan = DesaKelurahan::with(['kecamatan.kabupatenkota.provinsi'])->find($id);

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

        return response()->json([
            'status' => 'success',
            'data'   => [
                'id'                    => $desakelurahan->id,
                'kode'                  => $desakelurahan->kode,
                'nama'                  => $desakelurahan->nama,
                'path'                  => $desakelurahan->path,
                'kecamatan_id'          => $desakelurahan->kecamatan_id,
                'nama_kecamatan'        => $desakelurahan->kecamatan->nama,
                'kabupaten_kota_id'     => $desakelurahan->kecamatan->kabupaten_kota_id,
                'nama_kabupaten_kota'   => $desakelurahan->kecamatan->kabupatenkota->nama,
                'provinsi_id'           => $desakelurahan->kecamatan->kabupatenkota->provinsi_id,
                'nama_provinsi'         => $desakelurahan->kecamatan->kabupatenkota->provinsi->nama,
            ]
        ]);
    }

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

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

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

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

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

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

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

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