<?php

namespace Tests\Modules\Estoque;

use Tests\TestCase;

/**
 * Testes para o módulo Estoque
 */
class InventoryTest extends TestCase {
    
    public function testStockMovement(): void {
        $productId = $this->createTestProduct(['estoque' => 10.0]);
        
        // Criar tabela de movimentações
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS inventory_movements (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                tenant_id VARCHAR(100) NOT NULL,
                product_id INTEGER NOT NULL,
                tipo VARCHAR(20) NOT NULL,
                quantidade DECIMAL(18,3) NOT NULL,
                motivo VARCHAR(255),
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
        
        // Registrar movimentação de entrada
        $stmt = $this->pdo->prepare('
            INSERT INTO inventory_movements (tenant_id, product_id, tipo, quantidade, motivo)
            VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $productId, 'entrada', 5.0, 'Compra']);
        
        // Atualizar estoque
        $stmt = $this->pdo->prepare('
            UPDATE products 
            SET estoque = estoque + ?
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([5.0, $productId, $this->tenantId]);
        
        // Verificar estoque
        $stmt = $this->pdo->prepare('SELECT estoque FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertEquals(15.0, $product['estoque']);
    }
    
    public function testStockExit(): void {
        $productId = $this->createTestProduct(['estoque' => 10.0]);
        
        // Criar tabela de movimentações
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS inventory_movements (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                tenant_id VARCHAR(100) NOT NULL,
                product_id INTEGER NOT NULL,
                tipo VARCHAR(20) NOT NULL,
                quantidade DECIMAL(18,3) NOT NULL,
                motivo VARCHAR(255),
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
        
        // Registrar movimentação de saída
        $stmt = $this->pdo->prepare('
            INSERT INTO inventory_movements (tenant_id, product_id, tipo, quantidade, motivo)
            VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $productId, 'saida', 3.0, 'Venda']);
        
        // Atualizar estoque
        $stmt = $this->pdo->prepare('
            UPDATE products 
            SET estoque = estoque - ?
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([3.0, $productId, $this->tenantId]);
        
        // Verificar estoque
        $stmt = $this->pdo->prepare('SELECT estoque FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertEquals(7.0, $product['estoque']);
    }
    
    public function testInsufficientStock(): void {
        $productId = $this->createTestProduct(['estoque' => 5.0]);
        
        // Tentar retirar mais estoque do que disponível
        $stmt = $this->pdo->prepare('SELECT estoque FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $estoqueDisponivel = (float)$product['estoque'];
        $quantidadeSolicitada = 10.0;
        
        $this->assertLessThan($quantidadeSolicitada, $estoqueDisponivel);
        $this->assertFalse($estoqueDisponivel >= $quantidadeSolicitada);
    }
    
    public function testStockAdjustment(): void {
        $productId = $this->createTestProduct(['estoque' => 10.0]);
        
        // Ajuste de estoque
        $novoEstoque = 15.0;
        $stmt = $this->pdo->prepare('
            UPDATE products 
            SET estoque = ?
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute([$novoEstoque, $productId, $this->tenantId]);
        
        // Verificar estoque
        $stmt = $this->pdo->prepare('SELECT estoque FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertEquals(15.0, $product['estoque']);
    }
}

