<?php

namespace Tests\Unit;

use App\Models\SolicitudBien;
use App\Models\Usuario;
use App\Services\AsignacionSupportService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Carbon;
use Tests\TestCase;

class AsignacionSupportServiceTest extends TestCase
{
    use RefreshDatabase;

    public function test_preload_solicitud_for_alimentos_uses_latest_open_request_and_maps_current_stock(): void
    {
        $service = new AsignacionSupportService();

        Usuario::query()->create([
            'name' => 'Solicitante Demo',
            'cedula' => '12345678',
            'nombre' => 'Solicitante Demo',
            'cargo' => 'Solicitante',
            'tipo' => 7,
        ]);

        SolicitudBien::query()->create([
            'numero_solicitud' => 'SM-OLD-000001',
            'solicitante_cedula' => '12345678',
            'estado' => 'pendiente',
            'articulos_count' => 1,
            'unidades_count' => 2,
            'detalle_json' => [
                ['codigo' => 'ABS001', 'descripcion' => 'Arroz', 'cantidad' => 2, 'tipo' => 'Consumible'],
            ],
            'fecha_solicitud' => Carbon::parse('2026-04-20 08:00:00'),
        ]);

        $latest = SolicitudBien::query()->create([
            'numero_solicitud' => 'SM-NEW-000002',
            'solicitante_cedula' => '12345678',
            'estado' => 'generada',
            'articulos_count' => 3,
            'unidades_count' => 10,
            'detalle_json' => [
                ['codigo' => 'ABS001', 'descripcion' => 'Arroz', 'cantidad' => 6, 'tipo' => 'Consumible'],
                ['codigo' => 'ABS002', 'descripcion' => 'Pasta', 'cantidad' => 2, 'tipo' => 'Consumible'],
                ['codigo' => 'ABS404', 'descripcion' => 'No disponible', 'cantidad' => 1, 'tipo' => 'Consumible'],
            ],
            'fecha_solicitud' => Carbon::parse('2026-04-22 09:30:00'),
        ]);

        SolicitudBien::query()->create([
            'numero_solicitud' => 'SM-CLOSED-000003',
            'solicitante_cedula' => '12345678',
            'estado' => 'recibida',
            'articulos_count' => 1,
            'unidades_count' => 1,
            'detalle_json' => [
                ['codigo' => 'ABS003', 'descripcion' => 'Azucar', 'cantidad' => 1, 'tipo' => 'Consumible'],
            ],
            'fecha_solicitud' => Carbon::parse('2026-04-22 10:00:00'),
        ]);

        $resultado = $service->preloadSolicitudForAlimentos('12345678', [
            [
                'codigo' => 'ABS001',
                'descripcion' => 'Arroz',
                'marca' => 'Marca A',
                'tipo' => 'Consumible',
                'almacenado' => '2 SACOS',
                'en_stock' => '4 UNIDADES',
                'stock_disponible' => 4,
                'entregado' => '0 UNIDADES',
            ],
            [
                'codigo' => 'ABS002',
                'descripcion' => 'Pasta',
                'marca' => 'Marca B',
                'tipo' => 'Consumible',
                'almacenado' => '1 CAJA',
                'en_stock' => '8 UNIDADES',
                'stock_disponible' => 8,
                'entregado' => '0 UNIDADES',
            ],
        ]);

        $this->assertNotNull($resultado['solicitud']);
        $this->assertSame($latest->id, $resultado['solicitud']->id);
        $this->assertCount(2, $resultado['items']);
        $this->assertSame(3, $resultado['summary']['requested_items']);
        $this->assertSame(2, $resultado['summary']['loaded_items']);
        $this->assertSame(1, $resultado['summary']['omitted_items']);
        $this->assertSame('ABS001', $resultado['items'][0]['codigo']);
        $this->assertSame(4, $resultado['items'][0]['cantidad']);
        $this->assertSame('4 UNIDADES', $resultado['items'][0]['stock']);
        $this->assertSame('ABS002', $resultado['items'][1]['codigo']);
        $this->assertSame(2, $resultado['items'][1]['cantidad']);
    }
}