<?php

namespace App\Http\Controllers\Admin;

use App\Exceptions\ImportEstacionesException;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\EstacionImportOmitidaUpdateRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\EstacionImportOmitida;
use App\Services\EstacionesImportService;
use Illuminate\Http\JsonResponse;
use Throwable;

class EstacionesOmitidasController extends Controller
{
    private const INDEX_COLUMNS = [
        'eo.id',
        'eo.batch_id',
        'eo.row_number',
        'eo.direccion',
        'eo.coordenadas',
        'eo.ciudad',
        'eo.departamento',
        'eo.failed_field',
        'eo.reason',
        'eo.row_data',
        'eo.status',
        'eo.resolved_ciudad_id',
        'eo.resolved_at',
        'eo.created_at',
        'eo.updated_at',
        'c.nombre as resolved_ciudad',
    ];

    /**
     * Lista omitidas persistidas para revisión manual desde el admin.
     */
    public function index(): DefaultCollection
    {
        $size = request('page.size', 80);
        $page = request('page.number', 1);
        $sort = request('sort', null);

        $result = EstacionImportOmitida::query()
            ->from('estaciones_import_omitidas as eo')
            ->leftJoin('ciudades as c', 'c.id', '=', 'eo.resolved_ciudad_id')
            ->select(self::INDEX_COLUMNS)
            ->applySorts($sort, 'eo.id')
            ->filterLike(request('filter', []))
            ->orderByDesc('eo.id')
            ->paginate($size, self::INDEX_COLUMNS, 'page[number]', $page);

        return DefaultCollection::make($result);
    }

    /**
     * Recupera una omitida puntual para editar datos y resolverla.
     */
    public function edit($id): DefaultResource
    {
        return DefaultResource::make(
            EstacionImportOmitida::query()->findOrFail($id)
        );
    }

    /**
     * Guarda correcciones parciales sin resolver todavía la fila.
     */
    public function update(EstacionImportOmitidaUpdateRequest $request, $id): DefaultResource
    {
        $record = EstacionImportOmitida::query()->findOrFail($id);
        $record->fill($request->validated())->save();

        return DefaultResource::make($record);
    }

    /**
     * Inserta la estación corregida y marca la omitida como resuelta.
     */
    public function resolve(
        EstacionImportOmitidaUpdateRequest $request,
        $id,
        EstacionesImportService $service
    ): JsonResponse {
        try {
            $record = EstacionImportOmitida::query()->findOrFail($id);
            $record->fill($request->validated())->save();

            $result = $service->resolveSkippedRecord($record);

            return response()->json($result);
        } catch (ImportEstacionesException $exception) {
            return response()->json([
                'message' => $exception->getMessage(),
            ], 422);
        } catch (Throwable $exception) {
            return response()->json([
                'message' => 'Ocurrió un error al resolver la fila omitida.',
            ], 500);
        }
    }
}
