<?php

namespace Tests\Feature;

use App\Models\Confeccion;
use App\Models\InventarioPrenda;
use App\Models\OrdenProduccion;
use App\Models\ProcesoAcabado;
use App\Models\Tintoreria;
use App\Models\TrasladoPrenda;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class TrasladoFlowTest extends TestCase
{
    use RefreshDatabase;

    public function test_flow_creates_traslados_and_inventory()
    {
        // Crear OP
        $op = OrdenProduccion::create([
            'prenda_modelo' => 'Camisa A',
            'referencia' => 'CAM-A',
            'cantidad_total' => 100,
            'fecha_inicio' => now(),
            'fecha_entrega_estimada' => now()->addDays(7),
            'estado' => 'en_confeccion',
        ]);

        // Crear proveedor/taller/tintorería para usar en los pasos
        // Crear proveedor compatible con migraciones actuales
        $proveedor = \App\Models\Proveedor::create([
            'nombre' => 'Proveedor Test',
            'nit' => '123456789',
            'categoria' => 'talleres',
        ]);

        // Paso 1: Confección - envía 100, llegan 95, 2 faltantes
        $conf = Confeccion::create([
            'proveedor_id' => $proveedor->id,
            'orden_produccion_id' => $op->id,
            'fecha_envio' => now(),
            'cantidad_enviada' => 100,
            'fecha_recepcion' => now(),
            'cantidad_recibida' => 95,
            'prendas_defectuosas' => 2,
            'valor_por_prenda' => 1000,
        ]);

        $this->assertDatabaseHas('traslados_prenda', [
            'referencia_type' => Confeccion::class,
            'referencia_id' => $conf->id,
            'origen' => 'confeccion',
            'destino' => 'tintoreria',
            'cantidad_enviada' => 100,
            'cantidad_recibida' => 95,
            'prendas_defectuosas' => 2,
            'residual' => 3,
        ]);

        $op->refresh();
        $this->assertEquals('en_tintoreria', $op->estado);

        // Paso 2: Tintorería - envía 95, llegan 94, perdida 1
        $tint = Tintoreria::create([
            'proveedor_id' => $proveedor->id,
            'orden_produccion_id' => $op->id,
            'tipo_proceso' => 'Tinte',
            'fecha_envio' => now(),
            'cantidad_enviada' => 95,
            'fecha_recepcion' => now(),
            'cantidad_recibida' => 94,
            'perdidas' => 1,
        ]);

        $this->assertDatabaseHas('traslados_prenda', [
            'referencia_type' => Tintoreria::class,
            'referencia_id' => $tint->id,
            'origen' => 'tintoreria',
            'destino' => 'acabados',
            'cantidad_enviada' => 95,
            'cantidad_recibida' => 94,
            'prendas_defectuosas' => 1,
            'residual' => 0,
        ]);

        $op->refresh();
        // Puede ser que no haya procesos de acabado definidos y la OP ya esté finalizada;
        $this->assertTrue(in_array($op->estado, ['en_acabados', 'finalizada']), "Estado inesperado de OP: {$op->estado}");

        // Paso 3: Acabados - envía 94, llegan 94
        $acab = ProcesoAcabado::create([
            'orden_produccion_id' => $op->id,
            'tipo_proceso' => 'Acabado',
            'proveedor_id' => $proveedor->id,
            'cantidad_enviada' => 94,
            'fecha_envio' => now(),
            'fecha_recepcion' => now(),
            'cantidad_recibida' => 94,
        ]);

        $this->assertDatabaseHas('traslados_prenda', [
            'referencia_type' => ProcesoAcabado::class,
            'referencia_id' => $acab->id,
            'origen' => 'acabados',
            'destino' => 'bodega',
            'cantidad_enviada' => 94,
            'cantidad_recibida' => 94,
            'residual' => 0,
        ]);

        $op->refresh();
        $this->assertEquals('finalizada', $op->estado);

        // Inventario creado
        $this->assertDatabaseHas('inventario_prendas', [
            'orden_produccion_id' => $op->id,
            'cantidad_terminada' => 94,
            'cantidad_disponible' => 94,
            'estado' => 'en_bodega',
        ]);
    }
}
