<?php

namespace Tests\Modules\Produtos;

use Tests\TestCase;

/**
 * Testes para o módulo Produtos
 */
class ProductsTest extends TestCase {
    
    public function testCreateProduct(): void {
        $productId = $this->createTestProduct([
            'codigo' => 'PROD001',
            'nome' => 'Test Product',
            'preco' => 100.00,
            'estoque' => 10.0
        ]);
        
        $this->assertIsInt($productId);
        $this->assertGreaterThan(0, $productId);
        
        // Verificar se o produto foi criado
        $stmt = $this->pdo->prepare('SELECT * FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertNotFalse($product);
        $this->assertEquals('PROD001', $product['codigo']);
        $this->assertEquals('Test Product', $product['nome']);
        $this->assertEquals(100.00, $product['preco']);
        $this->assertEquals(10.0, $product['estoque']);
    }
    
    public function testUpdateProduct(): void {
        $productId = $this->createTestProduct();
        
        // Atualizar produto
        $stmt = $this->pdo->prepare('
            UPDATE products 
            SET nome = ?, preco = ?, estoque = ?
            WHERE id = ? AND tenant_id = ?
        ');
        $stmt->execute(['Updated Product', 150.00, 20.0, $productId, $this->tenantId]);
        
        // Verificar atualização
        $stmt = $this->pdo->prepare('SELECT * FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertEquals('Updated Product', $product['nome']);
        $this->assertEquals(150.00, $product['preco']);
        $this->assertEquals(20.0, $product['estoque']);
    }
    
    public function testDeleteProduct(): void {
        $productId = $this->createTestProduct();
        
        // Deletar produto
        $stmt = $this->pdo->prepare('DELETE FROM products WHERE id = ? AND tenant_id = ?');
        $stmt->execute([$productId, $this->tenantId]);
        
        // Verificar deleção
        $stmt = $this->pdo->prepare('SELECT * FROM products WHERE id = ?');
        $stmt->execute([$productId]);
        $product = $stmt->fetch();
        
        $this->assertFalse($product);
    }
    
    public function testUpdateStock(): void {
        $productId = $this->createTestProduct(['estoque' => 10.0]);
        
        // 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 testProductTenantIsolation(): void {
        // Criar produto no tenant de teste
        $productId1 = $this->createTestProduct(['codigo' => 'PROD001']);
        
        // Criar produto em outro tenant
        $stmt = $this->pdo->prepare('
            INSERT INTO products (tenant_id, codigo, nome, preco, estoque)
            VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute(['other-tenant', 'PROD002', 'Product 2', 200.00, 20.0]);
        
        // Verificar isolamento
        $stmt = $this->pdo->prepare('SELECT COUNT(*) as count FROM products WHERE tenant_id = ?');
        $stmt->execute([$this->tenantId]);
        $count = $stmt->fetch();
        
        $this->assertEquals(1, $count['count']);
    }
}

