<?php

namespace Tests\Modules\Motopecas;

use Tests\TestCase;
use PDO;

/**
 * Testes para o módulo Motopecas
 */
class MotopecasTest extends TestCase {
    
    protected function setUp(): void {
        parent::setUp();
        $this->createMotopecasTables();
    }
    
    private function createMotopecasTables(): void {
        // Tabela de peças
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS motopecas_pecas (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                product_id INTEGER NULL,
                codigo VARCHAR(100) NOT NULL,
                descricao VARCHAR(255) NOT NULL,
                marca 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 motopecas_compatibilidade (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                peca_id INTEGER NOT NULL,
                marca_moto VARCHAR(100) NOT NULL,
                modelo_moto VARCHAR(100) NOT NULL,
                ano_inicio INTEGER NULL,
                ano_fim INTEGER NULL,
                observacoes TEXT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (peca_id) REFERENCES motopecas_pecas(id) ON DELETE CASCADE
            )
        ');
    }
    
    public function testCreatePeca(): void {
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_pecas (
                codigo, descricao, marca, categoria, ncm, cest,
                preco_custo, preco_venda, estoque, estoque_minimo, unidade, ativo
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ');
        
        $stmt->execute([
            'PECA001',
            'Pistão CG 160',
            'Honda',
            'Motor',
            '87141000',
            '2801401',
            50.00,
            100.00,
            10.0,
            2.0,
            'UN',
            1
        ]);
        
        $id = (int)$this->pdo->lastInsertId();
        $this->assertGreaterThan(0, $id);
        
        // Verificar se foi criada
        $stmt = $this->pdo->prepare('SELECT * FROM motopecas_pecas WHERE id = ?');
        $stmt->execute([$id]);
        $peca = $stmt->fetch();
        
        $this->assertNotFalse($peca);
        $this->assertEquals('PECA001', $peca['codigo']);
        $this->assertEquals('Pistão CG 160', $peca['descricao']);
        $this->assertEquals('Honda', $peca['marca']);
    }
    
    public function testAddCompatibilidade(): void {
        // Criar peça
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_pecas (codigo, descricao, marca, ativo)
            VALUES (?, ?, ?, ?)
        ');
        $stmt->execute(['PECA002', 'Peça Teste', 'Yamaha', 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        // Adicionar compatibilidade
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_compatibilidade (
                peca_id, marca_moto, modelo_moto, ano_inicio, ano_fim
            ) VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute([$pecaId, 'Yamaha', 'Fazer 250', 2020, 2024]);
        
        $compatId = (int)$this->pdo->lastInsertId();
        $this->assertGreaterThan(0, $compatId);
        
        // Verificar compatibilidade
        $stmt = $this->pdo->prepare('SELECT * FROM motopecas_compatibilidade WHERE id = ?');
        $stmt->execute([$compatId]);
        $compat = $stmt->fetch();
        
        $this->assertNotFalse($compat);
        $this->assertEquals('Yamaha', $compat['marca_moto']);
        $this->assertEquals('Fazer 250', $compat['modelo_moto']);
    }
    
    public function testBuscarPorModelo(): void {
        // Criar peça com compatibilidade
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_pecas (codigo, descricao, marca, ativo)
            VALUES (?, ?, ?, ?)
        ');
        $stmt->execute(['PECA003', 'Peça Honda', 'Honda', 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_compatibilidade (peca_id, marca_moto, modelo_moto, ano_inicio, ano_fim)
            VALUES (?, ?, ?, ?, ?)
        ');
        $stmt->execute([$pecaId, 'Honda', 'CG 160', 2018, 2024]);
        
        // Buscar por modelo
        $stmt = $this->pdo->prepare('
            SELECT p.*, c.marca_moto, c.modelo_moto
            FROM motopecas_pecas p
            INNER JOIN motopecas_compatibilidade c ON c.peca_id = p.id
            WHERE c.marca_moto LIKE ? AND c.modelo_moto LIKE ? AND p.ativo = 1
        ');
        $stmt->execute(['%Honda%', '%CG%']);
        $resultados = $stmt->fetchAll();
        
        $this->assertNotEmpty($resultados);
        $this->assertEquals('Honda', $resultados[0]['marca_moto']);
    }
    
    public function testUpdatePeca(): void {
        // Criar peça
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_pecas (codigo, descricao, preco_venda, ativo)
            VALUES (?, ?, ?, ?)
        ');
        $stmt->execute(['PECA004', 'Peça Original', 100.00, 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        // Atualizar
        $stmt = $this->pdo->prepare('
            UPDATE motopecas_pecas SET descricao = ?, preco_venda = ?, updated_at = CURRENT_TIMESTAMP
            WHERE id = ?
        ');
        $stmt->execute(['Peça Atualizada', 150.00, $pecaId]);
        
        // Verificar
        $stmt = $this->pdo->prepare('SELECT * FROM motopecas_pecas WHERE id = ?');
        $stmt->execute([$pecaId]);
        $peca = $stmt->fetch();
        
        $this->assertEquals('Peça Atualizada', $peca['descricao']);
        $this->assertEquals(150.00, $peca['preco_venda']);
    }
    
    public function testDeletePeca(): void {
        // Criar peça
        $stmt = $this->pdo->prepare('
            INSERT INTO motopecas_pecas (codigo, descricao, ativo)
            VALUES (?, ?, ?)
        ');
        $stmt->execute(['PECA005', 'Peça para Deletar', 1]);
        $pecaId = (int)$this->pdo->lastInsertId();
        
        // Deletar
        $stmt = $this->pdo->prepare('DELETE FROM motopecas_pecas WHERE id = ?');
        $stmt->execute([$pecaId]);
        
        // Verificar
        $stmt = $this->pdo->prepare('SELECT * FROM motopecas_pecas WHERE id = ?');
        $stmt->execute([$pecaId]);
        $peca = $stmt->fetch();
        
        $this->assertFalse($peca);
    }
}

