<?php

namespace Tests\Unit;

use App\Models\Bien;
use App\Models\RegistroStock;
use App\Models\TipoInsumo;
use App\Models\Usuario;
use App\Services\AlmacenService;
use App\Services\InventoryCostingService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class AlmacenServiceTest extends TestCase
{
    use RefreshDatabase;

    public function test_actualizar_updates_stock_with_almacenado_relation_plus_manual_stock_delta(): void
    {
        $costingService = \Mockery::mock(InventoryCostingService::class);
        $costingService->shouldReceive('registerIngreso')->once();
        $costingService->shouldReceive('consumeSalida')->never();

        $service = new AlmacenService($costingService);

        $editor = Usuario::query()->create([
            'name' => 'Almacenista Demo',
            'cedula' => '99887766',
            'nombre' => 'Almacenista Demo',
            'cargo' => 'Almacenista',
            'tipo' => 2,
        ]);

        $tipo = TipoInsumo::query()->create([
            'nombre' => 'Equipo',
        ]);

        Bien::query()->create([
            'codigo' => 'ABS00001',
            'descripcion' => 'Bien de carga',
            'marca' => 'Marca Demo',
            'tipo' => $tipo->id,
            'unidad' => 'CAJAS',
            'cantidadUnidad' => 2,
            'unidadUtil' => 'UNIDADES',
            'cantidadUnidadUtil' => 8,
            'relacionUnidades' => 4,
            'cantidadEntregada' => 0,
        ]);

        $result = $service->actualizar([
            'items' => [[
                'codigo' => 'ABS00001',
                'descripcion' => 'Bien de carga',
                'tipo' => 'Equipo',
                'almacenado' => '2 CAJAS',
                'stock' => '8 UNIDADES',
                'cantidad_almacenado' => 1,
                'cantidad_stock' => 3,
                'observacion' => 'Carga simultanea',
            ]],
        ], $editor->id);

        $bien = Bien::query()->where('codigo', 'ABS00001')->firstOrFail();

        $this->assertTrue((bool) ($result['ok'] ?? false));
        $this->assertSame(1, (int) ($result['contProcesados'] ?? 0));
        $this->assertSame(0, (int) ($result['contOmitidos'] ?? 0));
        $this->assertSame(3, (int) $bien->cantidadUnidad);
        $this->assertSame(15, (int) $bien->cantidadUnidadUtil);
        $this->assertSame(2, RegistroStock::query()->count());
        $this->assertDatabaseHas('registrosstock', [
            'codigo' => 'ABS00001',
            'cantidad' => 1,
            'objetivo' => 1,
        ]);
        $this->assertDatabaseHas('registrosstock', [
            'codigo' => 'ABS00001',
            'cantidad' => 3,
            'objetivo' => 2,
        ]);
        $this->assertSame(1, (int) data_get($result, 'resultadoItems.0.cantidad_almacenado'));
        $this->assertSame(3, (int) data_get($result, 'resultadoItems.0.cantidad_stock'));
        $this->assertSame(15, (int) data_get($result, 'resultadoItems.0.stock_despues'));
    }
}