<?php

namespace Tests\Modules\Autopecas;

use Tests\TestCase;
use PDO;

/**
 * Testes para o módulo Autopecas
 */
class AutopecasTest extends TestCase {
    
    protected function setUp(): void {
        parent::setUp();
        $this->createAutopecasTables();
    }
    
    private function createAutopecasTables(): void {
        // Tabela de peças
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS autopecas_pecas (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                product_id INTEGER NULL,
                codigo VARCHAR(100) NOT NULL,
                descricao VARCHAR(255) NOT NULL,
                marca VARCHAR(100) NULL,
                fabricante VARCHAR(100) NULL,
                categoria VARCHAR(100) NULL,
                ncm VARCHAR(8) NULL,
                cest VARCHAR(7) NULL,
                preco_custo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
                preco_venda DECIMAL(12,2) NOT NULL DEFAULT 0.00,
                estoque DECIMAL(12,3) NOT NULL DEFAULT 0,
                estoque_minimo DECIMAL(12,3) NOT NULL DEFAULT 0,
                unidade VARCHAR(10) NOT NULL DEFAULT "UN",
                observacoes TEXT NULL,
                ativo BOOLEAN NOT NULL DEFAULT 1,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
        
        // Tabela de compatibilidade
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS autopecas_compatibilidade (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                peca_id INTEGER NOT NULL,
                marca_veiculo VARCHAR(100) NOT NULL,
                modelo_veiculo VARCHAR(100) NOT NULL,
                versao VARCHAR(100) NULL,
                ano_inicio INTEGER NULL,
                ano_fim INTEGER NULL,
                motor VARCHAR(100) NULL,
                observacoes TEXT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (peca_id) REFERENCES autopecas_pecas(id) ON DELETE CASCADE
            )
        ');
    }
    
    public function testCreatePeca(): void {
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_pecas (
                codigo, descricao, marca, fabricante, categoria, ncm, cest,
                preco_custo, preco_venda, estoque, ativo
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ');
        
        $stmt->execute([
            'AUTO001',
            'Filtro de Óleo',
            'Bosch',
            'GM',
            'Filtros',
            '87082900',
            '2801402',
            15.00,
            30.00,
            20.0,
            1
        ]);
        
        $id = (int)$this->pdo->lastInsertId();
        $this->assertGreaterThan(0, $id);
        
        // Verificar
        $stmt = $this->pdo->prepare('SELECT * FROM autopecas_pecas WHERE id = ?');
        $stmt->execute([$id]);
        $peca = $stmt->fetch();
        
        $this->assertNotFalse($peca);
        $this->assertEquals('AUTO001', $peca['codigo']);
        $this->assertEquals('Bosch', $peca['marca']);
        $this->assertEquals('GM', $peca['fabricante']);
    }
    
    public function testAddCompatibilidadeComVersaoEMotor(): void {
        // Criar peça
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_pecas (codigo, descricao, marca, fabricante, ativo)
            VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute(['AUTO002', 'Pastilha de Freio', 'TRW', 'Ford', 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        // Adicionar compatibilidade com versão e motor
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_compatibilidade (
                peca_id, marca_veiculo, modelo_veiculo, versao, ano_inicio, ano_fim, motor
            ) VALUES (?, ?, ?, ?, ?, ?, ?)
        ');
        $stmt->execute([
            $pecaId,
            'Ford',
            'Fiesta',
            '1.6',
            2015,
            2020,
            '1.6 Flex'
        ]);
        
        $compatId = (int)$this->pdo->lastInsertId();
        $this->assertGreaterThan(0, $compatId);
        
        // Verificar
        $stmt = $this->pdo->prepare('SELECT * FROM autopecas_compatibilidade WHERE id = ?');
        $stmt->execute([$compatId]);
        $compat = $stmt->fetch();
        
        $this->assertNotFalse($compat);
        $this->assertEquals('Ford', $compat['marca_veiculo']);
        $this->assertEquals('Fiesta', $compat['modelo_veiculo']);
        $this->assertEquals('1.6', $compat['versao']);
        $this->assertEquals('1.6 Flex', $compat['motor']);
    }
    
    public function testBuscarPorModeloVersaoMotor(): void {
        // Criar peça com compatibilidade
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_pecas (codigo, descricao, marca, ativo)
            VALUES (?, ?, ?, ?)
        ');
        $stmt->execute(['AUTO003', 'Peça VW', 'VW', 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_compatibilidade (
                peca_id, marca_veiculo, modelo_veiculo, versao, ano_inicio, motor
            ) VALUES (?, ?, ?, ?, ?, ?)
        ');
        $stmt->execute([$pecaId, 'VW', 'Gol', '1.0', 2018, '1.0 MPI']);
        
        // Buscar por modelo, versão e motor
        $stmt = $this->pdo->prepare('
            SELECT p.*, c.marca_veiculo, c.modelo_veiculo, c.versao, c.motor
            FROM autopecas_pecas p
            INNER JOIN autopecas_compatibilidade c ON c.peca_id = p.id
            WHERE c.marca_veiculo LIKE ? AND c.modelo_veiculo LIKE ? 
            AND c.versao LIKE ? AND c.motor LIKE ? AND p.ativo = 1
        ');
        $stmt->execute(['%VW%', '%Gol%', '%1.0%', '%MPI%']);
        $resultados = $stmt->fetchAll();
        
        $this->assertNotEmpty($resultados);
        $this->assertEquals('VW', $resultados[0]['marca_veiculo']);
        $this->assertEquals('Gol', $resultados[0]['modelo_veiculo']);
    }
    
    public function testUpdatePeca(): void {
        // Criar peça
        $stmt = $this->pdo->prepare('
            INSERT INTO autopecas_pecas (codigo, descricao, preco_venda, ativo)
            VALUES (?, ?, ?, ?)
        ');
        $stmt->execute(['AUTO004', 'Peça Original', 200.00, 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        // Atualizar
        $stmt = $this->pdo->prepare('
            UPDATE autopecas_pecas SET 
                descricao = ?, preco_venda = ?, fabricante = ?, updated_at = CURRENT_TIMESTAMP
            WHERE id = ?
        ');
        $stmt->execute(['Peça Atualizada', 250.00, 'Chevrolet', $pecaId]);
        
        // Verificar
        $stmt = $this->pdo->prepare('SELECT * FROM autopecas_pecas WHERE id = ?');
        $stmt->execute([$pecaId]);
        $peca = $stmt->fetch();
        
        $this->assertEquals('Peça Atualizada', $peca['descricao']);
        $this->assertEquals(250.00, $peca['preco_venda']);
        $this->assertEquals('Chevrolet', $peca['fabricante']);
    }
}

