<?php

namespace App\Repositories;

use App\Models\OrdenLavanderia;
use App\Repositories\Contracts\OrdenLavanderiaRepositoryInterface;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;

class EloquentOrdenLavanderiaRepository implements OrdenLavanderiaRepositoryInterface
{
    public function create(array $data): OrdenLavanderia
    {
        return OrdenLavanderia::create($data);
    }

    public function findById(int $id): ?OrdenLavanderia
    {
        return OrdenLavanderia::find($id);
    }

    public function findByFolio(string $folioUnico): ?OrdenLavanderia
    {
        return \App\Support\LaundryScanResolver::findOrdenByFolio($folioUnico);
    }

    public function update(OrdenLavanderia $orden, array $data): OrdenLavanderia
    {
        $orden->fill($data);
        $orden->save();

        return $orden;
    }

    public function getPendientesEnProceso(): Collection
    {
        $max = max(1, (int) config('lavanderia.dashboard_max_orders', 200));

        return OrdenLavanderia::query()
            ->select([
                'id',
                'folio_unico',
                'cliente_nombre',
                'tipo_servicio',
                'detalles_ropa',
                'instrucciones',
                'total',
                'is_priority',
                'current_step',
                'estatus',
                'current_step_started_at',
                'created_at',
                'fecha_entrega',
                'semaphore_hours_red',
                'semaphore_hours_yellow',
                'tipo_servicio_id',
            ])
            ->whereIn('estatus', [
                OrdenLavanderia::ESTATUS_PENDIENTE,
                OrdenLavanderia::ESTATUS_EN_PROCESO,
            ])
            ->orderByDesc('is_priority')
            ->orderBy('current_step_started_at', 'asc')
            ->limit($max)
            ->get();
    }

    public function paginate(array $filters = [], int $perPage = 20): LengthAwarePaginator
    {
        return OrdenLavanderia::query()
            ->with([
                'slaTipoServicio',
                'cliente:id,nombre,telefono',
            ])
            ->historialFilters($filters)
            ->orderByDesc('created_at')
            ->paginate($perPage);
    }

    public function listAbiertasEnRecepcion(array $filters = [], int $limit = 50): Collection
    {
        $limit = max(1, min(100, $limit));

        return OrdenLavanderia::query()
            ->select([
                'id',
                'folio_unico',
                'cliente_nombre',
                'total',
                'estatus',
                'current_step',
                'caja_id',
                'recepcionista_id',
                'updated_at',
                'created_at',
            ])
            ->where('estatus', OrdenLavanderia::ESTATUS_PENDIENTE)
            ->where('current_step', OrdenLavanderia::STEP_RECEPCION)
            ->when(! empty($filters['caja_id']), fn ($q) => $q->where('caja_id', (int) $filters['caja_id']))
            ->when(! empty($filters['recepcionista_id']), fn ($q) => $q->where('recepcionista_id', (int) $filters['recepcionista_id']))
            ->orderByDesc('updated_at')
            ->limit($limit)
            ->get();
    }
}
