-- ============================================================================
-- SISTEMA DE FATURAÇÃO SaaS MULTI-EMPRESA — ANGOLA (AGT)
-- ============================================================================
-- Motor: InnoDB (necessário para transações e chaves estrangeiras)
-- Charset: utf8mb4 (suporta acentuação PT completa)
--
-- NOTA IMPORTANTE SOBRE CONFORMIDADE AGT:
-- Este schema implementa a ESTRUTURA técnica exigida pelo Regime Jurídico
-- das Facturas (Decreto Presidencial 292/18 e Decreto 71/25) e pelas regras
-- de validação SAF-T (AO): numeração sequencial por série, cadeia de hash
-- entre documentos, campos obrigatórios, QR Code, e exportação SAF-T.
-- A CERTIFICAÇÃO em si (Número de Certificado de Validação) é um processo
-- administrativo junto da AGT que a empresa proprietária do software deve
-- submeter separadamente — este schema prepara o terreno técnico para isso.
-- ============================================================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ============================================================================
-- 1. PLATAFORMA (super-admin) — planos e gestão das empresas-cliente do SaaS
-- ============================================================================

CREATE TABLE planos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome                VARCHAR(60)     NOT NULL,               -- Ex: 'Básico', 'Profissional', 'Empresarial'
    descricao           VARCHAR(255)    NULL,
    preco_mensal        DECIMAL(12,2)   NOT NULL,               -- em Kwanzas (AOA)
    limite_faturas_mes  INT UNSIGNED    NULL,                   -- NULL = ilimitado
    limite_utilizadores INT UNSIGNED    NULL,
    limite_produtos     INT UNSIGNED    NULL,
    permite_saft        TINYINT(1)      NOT NULL DEFAULT 1,
    permite_multi_loja  TINYINT(1)      NOT NULL DEFAULT 0,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    criado_em           TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Preço de cada plano por ciclo de pagamento. Permite oferecer desconto
-- nos ciclos mais longos (ex: anual mais barato que 12x o mensal).
CREATE TABLE planos_precos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    plano_id            INT UNSIGNED NOT NULL,
    ciclo_faturacao     ENUM('mensal','trimestral','semestral','anual') NOT NULL,
    meses               TINYINT UNSIGNED NOT NULL,       -- 1, 3, 6 ou 12
    preco               DECIMAL(12,2) NOT NULL,           -- valor total cobrado nesse ciclo
    desconto_percentagem DECIMAL(5,2) NOT NULL DEFAULT 0, -- face ao preço mensal x meses, só informativo
    ativo               TINYINT(1) NOT NULL DEFAULT 1,
    CONSTRAINT fk_planos_precos_plano FOREIGN KEY (plano_id) REFERENCES planos(id) ON DELETE CASCADE,
    UNIQUE KEY uq_plano_ciclo (plano_id, ciclo_faturacao)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE empresas (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome                VARCHAR(150)    NOT NULL,               -- Nome comercial
    razao_social        VARCHAR(150)    NULL,
    nif                 VARCHAR(20)     NOT NULL UNIQUE,        -- NIF angolano do emitente
    regime_iva          ENUM('geral','simplificado','isento','exclusao') NOT NULL DEFAULT 'geral',
    atividade_economica VARCHAR(150)    NULL,                   -- CAE / actividade
    morada              VARCHAR(200)    NULL,
    cidade              VARCHAR(80)     NULL,
    provincia           VARCHAR(80)     NULL,
    pais                VARCHAR(60)     NOT NULL DEFAULT 'Angola',
    telefone            VARCHAR(30)     NULL,
    email               VARCHAR(120)    NULL,
    website             VARCHAR(150)    NULL,
    logotipo            VARCHAR(255)    NULL,                   -- caminho do ficheiro
    moeda_padrao        VARCHAR(3)      NOT NULL DEFAULT 'AOA',
    ambiente_agt        ENUM('teste','producao') NOT NULL DEFAULT 'teste',
    plano_id            INT UNSIGNED    NULL,
    estado              ENUM('ativa','suspensa','cancelada','trial') NOT NULL DEFAULT 'trial',
    trial_termina_em    DATE            NULL,
    criado_em           TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP,
    atualizado_em       TIMESTAMP       NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_empresas_plano FOREIGN KEY (plano_id) REFERENCES planos(id) ON DELETE SET NULL,
    INDEX idx_empresas_estado (estado),
    INDEX idx_empresas_nif (nif)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Configurações específicas de faturação por empresa (chave privada, certificado, etc.)
CREATE TABLE empresas_config_agt (
    id                      INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id              INT UNSIGNED NOT NULL,
    numero_certificado_agt  VARCHAR(40)  NULL,        -- Nº atribuído pela AGT ao software, quando certificado
    chave_privada_caminho   VARCHAR(255) NULL,        -- localização segura da chave privada RSA (fora do webroot)
    chave_publica_agt       TEXT         NULL,        -- chave pública fornecida pela AGT (ambiente de testes/produção)
    taxa_iva_padrao         DECIMAL(5,2) NOT NULL DEFAULT 14.00,
    nif_contabilista        VARCHAR(20)  NULL,
    software_certificado    TINYINT(1)   NOT NULL DEFAULT 0,
    criado_em               TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_config_agt_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    UNIQUE KEY uq_config_agt_empresa (empresa_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 2. ASSINATURAS / MENSALIDADES (cobrança SaaS às empresas-cliente)
-- ============================================================================

CREATE TABLE assinaturas (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    plano_id            INT UNSIGNED NOT NULL,
    data_inicio         DATE NOT NULL,
    data_fim            DATE NULL,                    -- NULL = em curso
    ciclo_faturacao     ENUM('mensal','trimestral','semestral','anual') NOT NULL DEFAULT 'mensal',
    valor_ciclo         DECIMAL(12,2) NOT NULL,        -- valor total cobrado em cada ciclo (não é sempre "mensal")
    proxima_renovacao   DATE NULL,                     -- data em que a próxima cobrança/renovação é devida
    estado              ENUM('ativa','cancelada','suspensa') NOT NULL DEFAULT 'ativa',
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_assinaturas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    CONSTRAINT fk_assinaturas_plano FOREIGN KEY (plano_id) REFERENCES planos(id),
    INDEX idx_assinaturas_empresa (empresa_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pagamentos_assinatura (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    assinatura_id       INT UNSIGNED NOT NULL,
    empresa_id          INT UNSIGNED NOT NULL,
    periodo_referencia   DATE NOT NULL,                -- primeiro dia do período coberto por este pagamento (mês, trimestre, semestre ou ano)
    valor               DECIMAL(12,2) NOT NULL,
    data_vencimento     DATE NOT NULL,
    data_pagamento      DATE NULL,
    metodo_pagamento    ENUM('transferencia','multicaixa','referencia_pagamento','dinheiro','outro') NULL,
    referencia          VARCHAR(80) NULL,
    comprovativo        VARCHAR(255) NULL,
    estado              ENUM('pendente','pago','atrasado','cancelado') NOT NULL DEFAULT 'pendente',
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_pag_assinatura FOREIGN KEY (assinatura_id) REFERENCES assinaturas(id) ON DELETE CASCADE,
    CONSTRAINT fk_pag_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    INDEX idx_pag_estado (estado),
    INDEX idx_pag_empresa_mes (empresa_id, periodo_referencia)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 3. UTILIZADORES (por empresa) e PERMISSÕES
-- ============================================================================

CREATE TABLE utilizadores (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    nome                VARCHAR(120) NOT NULL,
    email               VARCHAR(150) NOT NULL,
    password_hash       VARCHAR(255) NOT NULL,
    cargo               ENUM('super_admin','admin_empresa','gestor','operador','apenas_leitura') NOT NULL DEFAULT 'operador',
    estado              ENUM('ativo','inativo','bloqueado') NOT NULL DEFAULT 'ativo',
    ultimo_login        DATETIME NULL,
    token_recuperacao   VARCHAR(100) NULL,
    token_expira_em     DATETIME NULL,
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_utilizadores_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    UNIQUE KEY uq_utilizador_email_empresa (empresa_id, email),
    INDEX idx_utilizadores_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 4. CLIENTES (de cada empresa)
-- ============================================================================

CREATE TABLE clientes (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    tipo                ENUM('particular','empresa','consumidor_final') NOT NULL DEFAULT 'consumidor_final',
    nome                VARCHAR(150) NOT NULL,
    nif                 VARCHAR(20)  NULL,             -- pode ficar vazio => imprime "Consumidor final"
    morada              VARCHAR(200) NULL,
    cidade              VARCHAR(80)  NULL,
    provincia           VARCHAR(80)  NULL,
    pais                VARCHAR(60)  NOT NULL DEFAULT 'Angola',
    telefone            VARCHAR(30)  NULL,
    email               VARCHAR(120) NULL,
    limite_credito      DECIMAL(14,2) NULL,
    observacoes         TEXT NULL,
    estado              ENUM('ativo','inativo') NOT NULL DEFAULT 'ativo',
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    atualizado_em       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_clientes_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    INDEX idx_clientes_empresa (empresa_id),
    INDEX idx_clientes_nif (nif)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 5. PRODUTOS / SERVIÇOS e ESTOQUE
-- ============================================================================

CREATE TABLE categorias_produtos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    nome                VARCHAR(100) NOT NULL,
    CONSTRAINT fk_categorias_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE produtos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    categoria_id        INT UNSIGNED NULL,
    tipo                ENUM('produto','servico') NOT NULL DEFAULT 'produto',
    codigo              VARCHAR(40)  NOT NULL,          -- SKU / referência interna
    codigo_barras       VARCHAR(40)  NULL,
    nome                VARCHAR(150) NOT NULL,
    descricao           TEXT NULL,
    unidade_medida      VARCHAR(10)  NOT NULL DEFAULT 'UN',   -- UN, KG, L, M, CX...
    preco_custo         DECIMAL(14,2) NOT NULL DEFAULT 0,
    preco_venda         DECIMAL(14,2) NOT NULL DEFAULT 0,
    taxa_iva            DECIMAL(5,2)  NOT NULL DEFAULT 14.00, -- 14 (geral), 7, 5, 2, 0 (isento)
    motivo_isencao_iva  VARCHAR(150)  NULL,             -- obrigatório se taxa_iva = 0
    controla_stock      TINYINT(1)   NOT NULL DEFAULT 1,
    stock_atual         DECIMAL(14,3) NOT NULL DEFAULT 0,
    stock_minimo        DECIMAL(14,3) NOT NULL DEFAULT 0,
    estado              ENUM('ativo','inativo') NOT NULL DEFAULT 'ativo',
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    atualizado_em       TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_produtos_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    CONSTRAINT fk_produtos_categoria FOREIGN KEY (categoria_id) REFERENCES categorias_produtos(id) ON DELETE SET NULL,
    UNIQUE KEY uq_produto_codigo_empresa (empresa_id, codigo),
    INDEX idx_produtos_empresa (empresa_id),
    INDEX idx_produtos_nome (nome)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE movimentos_stock (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    produto_id          INT UNSIGNED NOT NULL,
    tipo                ENUM('entrada','saida','ajuste','venda','anulacao_venda') NOT NULL,
    quantidade          DECIMAL(14,3) NOT NULL,          -- positiva; o "tipo" define o sentido
    stock_resultante    DECIMAL(14,3) NOT NULL,
    motivo              VARCHAR(150) NULL,
    documento_ref       VARCHAR(60)  NULL,               -- ex: número da fatura associada
    fatura_id           INT UNSIGNED NULL,
    utilizador_id       INT UNSIGNED NULL,
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_mov_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    CONSTRAINT fk_mov_produto FOREIGN KEY (produto_id) REFERENCES produtos(id) ON DELETE CASCADE,
    CONSTRAINT fk_mov_utilizador FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id) ON DELETE SET NULL,
    INDEX idx_mov_produto (produto_id),
    INDEX idx_mov_data (criado_em)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 6. SÉRIES DE DOCUMENTOS (numeração sequencial exigida pela AGT)
-- ============================================================================
-- Cada série deve ser comunicada à AGT antes de ser usada. Não pode haver
-- saltos nem reinício de numeração dentro do mesmo ano/série.

CREATE TABLE series_documentos (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    tipo_documento      ENUM('FT','FR','FS','FG','NC','ND','VD','GT') NOT NULL,
    -- FT=Fatura, FR=Fatura-Recibo, FS=Fatura Simplificada, FG=Fatura Global,
    -- NC=Nota de Crédito, ND=Nota de Débito, VD=Venda a Dinheiro, GT=Guia de Transporte
    codigo_serie        VARCHAR(20) NOT NULL,            -- ex: 'A', '2026', 'LUANDA-01'
    ano                 SMALLINT UNSIGNED NOT NULL,
    estabelecimento     VARCHAR(60) NULL,
    ultimo_numero       INT UNSIGNED NOT NULL DEFAULT 0,
    comunicada_agt      TINYINT(1) NOT NULL DEFAULT 0,
    data_comunicacao    DATE NULL,
    codigo_validacao_agt VARCHAR(60) NULL,               -- código que a AGT devolve ao comunicar a série
    estado              ENUM('ativa','encerrada') NOT NULL DEFAULT 'ativa',
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_series_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    UNIQUE KEY uq_serie (empresa_id, tipo_documento, codigo_serie, ano)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 7. FATURAS (documento fiscal)
-- ============================================================================

CREATE TABLE faturas (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    cliente_id          INT UNSIGNED NULL,               -- NULL permitido só se consumidor final sem registo
    serie_id            INT UNSIGNED NOT NULL,
    tipo_documento      ENUM('FT','FR','FS','FG','NC','ND','VD','GT') NOT NULL,
    numero              INT UNSIGNED NOT NULL,            -- número sequencial dentro da série
    numero_completo     VARCHAR(60) NOT NULL,             -- ex: 'FT 2026/145'
    fatura_original_id  BIGINT UNSIGNED NULL,             -- para Notas de Crédito/Débito: referência à fatura original
    data_emissao        DATETIME NOT NULL,
    data_vencimento     DATE NULL,
    moeda               VARCHAR(3) NOT NULL DEFAULT 'AOA',
    taxa_cambio         DECIMAL(14,6) NOT NULL DEFAULT 1,
    total_iliquido      DECIMAL(16,2) NOT NULL DEFAULT 0, -- soma antes de IVA e descontos
    total_desconto      DECIMAL(16,2) NOT NULL DEFAULT 0,
    total_iva           DECIMAL(16,2) NOT NULL DEFAULT 0,
    total_liquido        DECIMAL(16,2) NOT NULL DEFAULT 0, -- total final a pagar
    estado              ENUM('rascunho','emitida','paga','parcialmente_paga','anulada') NOT NULL DEFAULT 'rascunho',
    motivo_isencao_iva  VARCHAR(200) NULL,
    consumidor_final    TINYINT(1) NOT NULL DEFAULT 0,
    -- Campos de integridade AGT (cadeia de hash entre documentos):
    hash_atual          VARCHAR(172) NULL,                -- assinatura RSA/SHA1 codificada em base64
    hash_anterior       VARCHAR(172) NULL,                -- hash do documento anterior da mesma série (cadeia)
    hash_curto          VARCHAR(9)  NULL,                 -- 4 caracteres nas posições 1,11,21,31, separados por '-'
    qrcode_data         TEXT NULL,                        -- string codificada no QR Code
    saft_incluido       TINYINT(1) NOT NULL DEFAULT 0,     -- já foi incluído num ficheiro SAF-T exportado
    saft_exportacao_id  INT UNSIGNED NULL,
    observacoes         TEXT NULL,
    utilizador_id       INT UNSIGNED NULL,                -- quem emitiu
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    anulado_em          DATETIME NULL,
    anulado_motivo      VARCHAR(200) NULL,
    CONSTRAINT fk_faturas_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    CONSTRAINT fk_faturas_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE SET NULL,
    CONSTRAINT fk_faturas_serie FOREIGN KEY (serie_id) REFERENCES series_documentos(id),
    CONSTRAINT fk_faturas_original FOREIGN KEY (fatura_original_id) REFERENCES faturas(id) ON DELETE SET NULL,
    CONSTRAINT fk_faturas_utilizador FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id) ON DELETE SET NULL,
    UNIQUE KEY uq_fatura_numero_serie (serie_id, numero),
    INDEX idx_faturas_empresa (empresa_id),
    INDEX idx_faturas_cliente (cliente_id),
    INDEX idx_faturas_data (data_emissao),
    INDEX idx_faturas_estado (estado)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE fatura_linhas (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    fatura_id           BIGINT UNSIGNED NOT NULL,
    produto_id          INT UNSIGNED NULL,
    numero_linha        SMALLINT UNSIGNED NOT NULL,
    descricao           VARCHAR(255) NOT NULL,
    quantidade          DECIMAL(14,3) NOT NULL DEFAULT 1,
    unidade_medida      VARCHAR(10) NOT NULL DEFAULT 'UN',
    preco_unitario      DECIMAL(16,4) NOT NULL,
    desconto_percentagem DECIMAL(5,2) NOT NULL DEFAULT 0,
    valor_iliquido      DECIMAL(16,2) NOT NULL,           -- qtd * preço - desconto
    taxa_iva            DECIMAL(5,2) NOT NULL DEFAULT 14.00,
    motivo_isencao_iva  VARCHAR(200) NULL,
    valor_iva           DECIMAL(16,2) NOT NULL DEFAULT 0,
    valor_total_linha   DECIMAL(16,2) NOT NULL,
    CONSTRAINT fk_linhas_fatura FOREIGN KEY (fatura_id) REFERENCES faturas(id) ON DELETE CASCADE,
    CONSTRAINT fk_linhas_produto FOREIGN KEY (produto_id) REFERENCES produtos(id) ON DELETE SET NULL,
    INDEX idx_linhas_fatura (fatura_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pagamentos_faturas (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    fatura_id           BIGINT UNSIGNED NOT NULL,
    empresa_id          INT UNSIGNED NOT NULL,
    valor               DECIMAL(16,2) NOT NULL,
    data_pagamento      DATETIME NOT NULL,
    metodo_pagamento    ENUM('dinheiro','transferencia','multicaixa','cheque','outro') NOT NULL,
    referencia          VARCHAR(80) NULL,
    utilizador_id       INT UNSIGNED NULL,
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_pagfat_fatura FOREIGN KEY (fatura_id) REFERENCES faturas(id) ON DELETE CASCADE,
    CONSTRAINT fk_pagfat_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    INDEX idx_pagfat_fatura (fatura_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 8. SAF-T (AO) — EXPORTAÇÕES
-- ============================================================================

CREATE TABLE saft_exportacoes (
    id                  INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NOT NULL,
    periodo_inicio      DATE NOT NULL,
    periodo_fim         DATE NOT NULL,
    caminho_ficheiro    VARCHAR(255) NULL,
    hash_ficheiro       VARCHAR(128) NULL,
    total_documentos    INT UNSIGNED NOT NULL DEFAULT 0,
    estado              ENUM('gerado','enviado','erro') NOT NULL DEFAULT 'gerado',
    gerado_por          INT UNSIGNED NULL,
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_saft_empresa FOREIGN KEY (empresa_id) REFERENCES empresas(id) ON DELETE CASCADE,
    CONSTRAINT fk_saft_utilizador FOREIGN KEY (gerado_por) REFERENCES utilizadores(id) ON DELETE SET NULL,
    INDEX idx_saft_empresa_periodo (empresa_id, periodo_inicio, periodo_fim)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================================
-- 9. AUDITORIA (obrigatória para inviolabilidade dos dados fiscais)
-- ============================================================================

CREATE TABLE auditoria_log (
    id                  BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    empresa_id          INT UNSIGNED NULL,
    utilizador_id       INT UNSIGNED NULL,
    acao                VARCHAR(60) NOT NULL,             -- ex: 'fatura.emitir', 'fatura.anular', 'produto.editar'
    tabela_afetada      VARCHAR(60) NULL,
    registo_id          BIGINT UNSIGNED NULL,
    dados_antes         JSON NULL,
    dados_depois        JSON NULL,
    ip_origem           VARCHAR(45) NULL,
    criado_em           TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_auditoria_empresa (empresa_id),
    INDEX idx_auditoria_data (criado_em)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SET FOREIGN_KEY_CHECKS = 1;
