<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\CiudadAliasRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\CiudadAlias;

class CiudadesAliasesController extends Controller
{
    private const INDEX_COLUMNS = [
        'ca.id',
        'ca.nombre',
        'ca.slug',
        'ca.ciudad_id',
        'ca.created_at',
        'ca.updated_at',
        'c.nombre as ciudad',
        'd.nombre as departamento',
    ];

    /**
     * Lista aliases administrativos con ciudad y departamento asociados.
     */
    public function index(): DefaultCollection
    {
        $size = request('page.size', 80);
        $page = request('page.number', 1);
        $sort = request('sort', null);

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

        return DefaultCollection::make($result);
    }

    /**
     * Crea un alias apuntando a una ciudad oficial existente.
     */
    public function store(CiudadAliasRequest $request): DefaultResource
    {
        $input = $request->validated();
        $input['slug'] = str_slug($input['nombre']);

        return DefaultResource::make(CiudadAlias::query()->create($input));
    }

    /**
     * Recupera un alias individual para edición.
     */
    public function edit($id): DefaultResource
    {
        return DefaultResource::make(CiudadAlias::query()->findOrFail($id));
    }

    /**
     * Actualiza un alias sin aceptar payload arbitrario desde cliente.
     */
    public function update(CiudadAliasRequest $request, $id): DefaultResource
    {
        $alias = CiudadAlias::query()->findOrFail($id);
        $input = $request->validated();
        $input['slug'] = str_slug($input['nombre']);

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

        return DefaultResource::make($alias);
    }

    /**
     * Elimina un alias de ciudad.
     */
    public function destroy($id)
    {
        CiudadAlias::query()->findOrFail($id)->delete();

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