<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\CiudadRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\Ciudad;

class CiudadesController extends Controller
{
    private const INDEX_COLUMNS = [
        'c.id',
        'c.nombre',
        'c.slug',
        'c.latitud',
        'c.longitud',
        'c.departamento_id',
        'c.created_at',
        'c.updated_at',
        'd.nombre as departamento',
    ];

    /**
     * Lista ciudades con departamento resuelto y columnas mínimas explícitas.
     */
    public function index(): DefaultCollection
    {
        $size = request('page.size', 80);
        $page = request('page.number', 1);
        $sort = request('sort', null);

        $result = Ciudad::query()
            ->from('ciudades as c')
            ->join('departamentos as d', 'd.id', '=', 'c.departamento_id')
            ->select(self::INDEX_COLUMNS)
            ->applySorts($sort, 'c.id')
            ->filterLike(request('filter', []))
            ->orderByDesc('c.id')
            ->paginate($size, self::INDEX_COLUMNS, 'page[number]', $page);

        return DefaultCollection::make($result);
    }

    /**
     * Crea una ciudad oficial del catálogo.
     */
    public function store(CiudadRequest $request): DefaultResource
    {
        $input = $request->validated();
        $input['slug'] = str_slug($input['nombre']);

        return DefaultResource::make(Ciudad::create($input));
    }

    /**
     * Expone una ciudad para edición administrativa.
     */
    public function edit($id): DefaultResource
    {
        return DefaultResource::make(Ciudad::query()->findOrFail($id));
    }

    /**
     * Actualiza una ciudad sin aceptar campos fuera del contrato validado.
     */
    public function update(CiudadRequest $request, $id): DefaultResource
    {
        $city = Ciudad::query()->findOrFail($id);
        $input = $request->validated();
        $input['slug'] = str_slug($input['nombre']);

        $city->fill($input)->save();

        return DefaultResource::make($city);
    }

    /**
     * Elimina una ciudad del catálogo oficial.
     */
    public function destroy($id)
    {
        Ciudad::query()->findOrFail($id)->delete();

        return response()->noContent();
    }
}
