<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\CreateAnggotaRequest;
use App\Http\Requests\UpdateAnggotaRequest;
use App\Models\Anggota;
use App\Services\AnggotaService;
use Exception;

class AnggotaController extends Controller
{
    protected $anggotaService;

    public function __construct(AnggotaService $anggotaService)
    {
        $this->anggotaService = $anggotaService;
    }

    public function index()
    {
        $anggota = $this->anggotaService->getAllAnggota();
        return response()->json($anggota);
    }

    public function show(string $id)
    {
        $anggota = $this->anggotaService->findById($id);

        if (!$anggota) {
            return response()->json(['message' => 'Anggota tidak ditemukan'], 404);
        }

        return response()->json($anggota);
    }

    public function store(CreateAnggotaRequest $request)
    {
        try {
            $validatedData = $request->validated();

            $anggota = $this->anggotaService->createAnggota($validatedData);
            return response()->json($anggota, 201);
        } catch (\Exception $e) {
            return response()->json(['message' => $e->getMessage()], 400);
        }
    }

    public function update(UpdateAnggotaRequest $request, string $id)
    {
        try {
            $validatedData = $request->validated();

            $user = $this->anggotaService->updateAnggota($id, $validatedData);

            if (!$user) {
                return response()->json(['message' => 'Anggota tidak ditemukan'], 404);
            }

            return response()->json($user);
        } catch (\Exception $e) {
            return response()->json(['message' => $e->getMessage()], 400);
        }
    }

    public function destroy(string $id)
    {
        try {
            $deleted = $this->anggotaService->deleteAnggota($id);

            if (!$deleted) {
                return response()->json(['message' => 'Anggota tidak ditemukan atau tidak bisa dihapus'], 404);
            }

            return response()->json(['message' => 'Anggota berhasil dihapus'], 204);
        } catch (\Exception $e) {
            return response()->json(['message' => $e->getMessage()], 400);
        }
    }

    public function kelurahan()
    {
        return Anggota::select(['kelurahan'])->groupBy('kelurahan')->get();
    }

    public function kecamatan()
    {
        return Anggota::select(['kecamatan'])->groupBy('kecamatan')->get();
    }

    public function kabupaten()
    {
        return Anggota::select(['kabupaten'])->groupBy('kabupaten')->get();
    }
}
