<?php

declare(strict_types=1);

namespace App\Http\Requests\Pwa;

use App\Models\Credit;
use Illuminate\Foundation\Http\FormRequest;

/**
 * Valida el reordenamiento de créditos para un collector.
 *
 * Reglas estrictas:
 * - Todos los credit_id deben pertenecer a la misma company del usuario
 * - Todos deben tener collector_user_id = auth user
 * - Todos deben estar en estado activo (active, delayed, overdue)
 * - Deben ser créditos hoja (sin hijos)
 */
class ReorderCollectorCreditsRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        return [
            'credit_ids' => ['required', 'array', 'min:1'],
            'credit_ids.*' => ['required', 'integer'],
        ];
    }

    public function messages(): array
    {
        return [
            'credit_ids.required' => 'La lista de créditos es obligatoria.',
            'credit_ids.array' => 'La lista de créditos debe ser un arreglo.',
            'credit_ids.min' => 'La lista debe contener al menos un crédito.',
            'credit_ids.*.integer' => 'Cada ID de crédito debe ser un número entero.',
        ];
    }

    /**
     * Validación adicional después de las reglas básicas.
     */
    public function withValidator($validator): void
    {
        $validator->after(function ($validator) {
            if ($validator->errors()->isNotEmpty()) {
                return;
            }

            $user = $this->user();
            $creditIds = $this->input('credit_ids');

            // No duplicados
            if (count($creditIds) !== count(array_unique($creditIds))) {
                $validator->errors()->add('credit_ids', 'La lista contiene créditos duplicados.');

                return;
            }

            // Verificar que TODOS los credit_ids pertenecen al collector y están activos
            $validCount = Credit::where('company_id', $user->company_id)
                ->where('collector_user_id', $user->id)
                ->whereIn('status', Credit::ACTIVE_STATUSES)
                ->whereDoesntHave('children')
                ->whereIn('id', $creditIds)
                ->count();

            if ($validCount !== count($creditIds)) {
                $validator->errors()->add(
                    'credit_ids',
                    'Algunos créditos no existen, no están asignados a ti, o no están activos.'
                );
            }
        });
    }
}
