<?php

namespace Tests\Modules\SPED;

use Tests\TestCase;

/**
 * Testes para o módulo SPED
 */
class SPEDTest extends TestCase {
    
    protected function setUp(): void {
        parent::setUp();
        
        // Criar tabelas do SPED
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS sped_fiscal (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                tenant_id VARCHAR(100) NOT NULL,
                periodo VARCHAR(7) NOT NULL,
                status VARCHAR(20) DEFAULT "rascunho",
                arquivo_gerado TEXT,
                data_geracao DATETIME,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
        
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS sped_contribuicoes (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                tenant_id VARCHAR(100) NOT NULL,
                periodo VARCHAR(7) NOT NULL,
                status VARCHAR(20) DEFAULT "rascunho",
                arquivo_gerado TEXT,
                data_geracao DATETIME,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
        
        $this->pdo->exec('
            CREATE TABLE IF NOT EXISTS sped_contabil (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                tenant_id VARCHAR(100) NOT NULL,
                periodo VARCHAR(7) NOT NULL,
                status VARCHAR(20) DEFAULT "rascunho",
                arquivo_gerado TEXT,
                data_geracao DATETIME,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        ');
    }
    
    public function testCreateSPEDFiscal(): void {
        // Criar SPED Fiscal
        $periodo = date('Ym');
        $stmt = $this->pdo->prepare('
            INSERT INTO sped_fiscal (tenant_id, periodo, status)
            VALUES (?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $periodo, 'rascunho']);
        $spedId = (int)$this->pdo->lastInsertId();
        
        // Verificar SPED
        $stmt = $this->pdo->prepare('SELECT * FROM sped_fiscal WHERE id = ?');
        $stmt->execute([$spedId]);
        $sped = $stmt->fetch();
        
        $this->assertNotFalse($sped);
        $this->assertEquals($periodo, $sped['periodo']);
        $this->assertEquals('rascunho', $sped['status']);
    }
    
    public function testGenerateSPEDFiscal(): void {
        // Criar SPED Fiscal
        $periodo = date('Ym');
        $stmt = $this->pdo->prepare('
            INSERT INTO sped_fiscal (tenant_id, periodo, status)
            VALUES (?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $periodo, 'rascunho']);
        $spedId = (int)$this->pdo->lastInsertId();
        
        // Gerar arquivo (simulado)
        $arquivo = "SPED_FISCAL_{$periodo}.txt";
        $stmt = $this->pdo->prepare('
            UPDATE sped_fiscal 
            SET status = "gerado",
                arquivo_gerado = ?,
                data_geracao = ?
            WHERE id = ?
        ');
        $stmt->execute([$arquivo, date('Y-m-d H:i:s'), $spedId]);
        
        // Verificar geração
        $stmt = $this->pdo->prepare('SELECT * FROM sped_fiscal WHERE id = ?');
        $stmt->execute([$spedId]);
        $sped = $stmt->fetch();
        
        $this->assertEquals('gerado', $sped['status']);
        $this->assertNotNull($sped['arquivo_gerado']);
        $this->assertNotNull($sped['data_geracao']);
    }
    
    public function testCreateSPEDContribuicoes(): void {
        // Criar SPED Contribuições
        $periodo = date('Ym');
        $stmt = $this->pdo->prepare('
            INSERT INTO sped_contribuicoes (tenant_id, periodo, status)
            VALUES (?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $periodo, 'rascunho']);
        $spedId = (int)$this->pdo->lastInsertId();
        
        // Verificar SPED
        $stmt = $this->pdo->prepare('SELECT * FROM sped_contribuicoes WHERE id = ?');
        $stmt->execute([$spedId]);
        $sped = $stmt->fetch();
        
        $this->assertNotFalse($sped);
        $this->assertEquals($periodo, $sped['periodo']);
        $this->assertEquals('rascunho', $sped['status']);
    }
    
    public function testCreateSPEDContabil(): void {
        // Criar SPED Contábil
        $periodo = date('Ym');
        $stmt = $this->pdo->prepare('
            INSERT INTO sped_contabil (tenant_id, periodo, status)
            VALUES (?, ?, ?)
        ');
        $stmt->execute([$this->tenantId, $periodo, 'rascunho']);
        $spedId = (int)$this->pdo->lastInsertId();
        
        // Verificar SPED
        $stmt = $this->pdo->prepare('SELECT * FROM sped_contabil WHERE id = ?');
        $stmt->execute([$spedId]);
        $sped = $stmt->fetch();
        
        $this->assertNotFalse($sped);
        $this->assertEquals($periodo, $sped['periodo']);
        $this->assertEquals('rascunho', $sped['status']);
    }
}

