-- ==============================================================================
-- GESTÃO PLUS - MÓDULO COMERCIAL COMPLETO (COMPATÍVEL AGT / SAF-T AO)
-- ==============================================================================

PRAGMA foreign_keys = ON;

-- ------------------------------------------------------------------------------
-- 1. CONFIGURAÇÃO FISCAL E REGIME DE IVA DA EMPRESA (AGT)
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS empresa_config_fiscal (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    razao_social TEXT NOT NULL,
    nome_comercial TEXT,
    nif TEXT NOT NULL UNIQUE,
    registo_comercial TEXT,
    regime_iva TEXT NOT NULL DEFAULT 'GERAL', -- 'GERAL' (14%), 'SIMPLIFICADO' (7%), 'EXCLUSAO' (0%)
    aplica_retencao_fonte INTEGER DEFAULT 1,   -- 1 = Sim, 0 = Não
    taxa_retencao_fonte REAL DEFAULT 6.50,     -- 6.5% padrão para prestação de serviços (AO)
    limite_isencao_retencao REAL DEFAULT 0.00,  -- Valor a partir do qual incide a retenção
    moeda_base TEXT DEFAULT 'AOA',
    logotipo_path TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- ------------------------------------------------------------------------------
-- 2. ARMAZÉNS E LOCAIS DE ESTOQUE
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS armazens (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    codigo TEXT NOT NULL UNIQUE,              -- Ex: ARM-01, ARMAZEM-PRINCIPAL
    nome TEXT NOT NULL,
    localizacao TEXT,
    responsavel TEXT,
    e_padrao INTEGER DEFAULT 0,               -- 1 = Armazém Padrão de Venda
    ativo INTEGER DEFAULT 1
);

INSERT OR IGNORE INTO armazens (id, codigo, nome, e_padrao) VALUES (1, 'GERAL', 'Armazém Geral', 1);

-- ------------------------------------------------------------------------------
-- 3. BANCOS E CONTAS DE TESOURARIA
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS contas_bancarias (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    banco_nome TEXT NOT NULL,                  -- Ex: Banco BAI, BFA, BIC, BCI
    sigla TEXT NOT NULL,                       -- Ex: BAI, BFA
    numero_conta TEXT,
    iban TEXT UNIQUE NOT NULL,                 -- Exibido obrigatoriamente nas Faturas Proforma
    swift_bic TEXT,
    saldo_inicial REAL DEFAULT 0.00,
    saldo_atual REAL DEFAULT 0.00,
    ativo INTEGER DEFAULT 1
);

-- ------------------------------------------------------------------------------
-- 4. FORNECEDORES
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS fornecedores (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    codigo TEXT UNIQUE NOT NULL,
    tipo_entidade TEXT DEFAULT 'EMPRESA',      -- 'PESSOA' ou 'EMPRESA'
    nome_razao_social TEXT NOT NULL,
    nif TEXT UNIQUE NOT NULL,
    pais TEXT DEFAULT 'AO',
    provincia TEXT,
    cidade TEXT,
    endereco TEXT,
    telefone TEXT,
    email TEXT,
    pessoa_contacto TEXT,
    iban TEXT,
    limite_credito REAL DEFAULT 0.00,
    prazo_pagamento_dias INTEGER DEFAULT 0,
    ativo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- ------------------------------------------------------------------------------
-- 5. CLIENTES E ENTIDADES (Particulares vs Empresas)
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS clientes (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    codigo TEXT UNIQUE NOT NULL,               -- Ex: CLI-001
    tipo_entidade TEXT DEFAULT 'EMPRESA',      -- 'PESSOA' ou 'EMPRESA'
    nome_razao_social TEXT NOT NULL,
    nif TEXT DEFAULT '999999999',              -- 999999999 para Consumidor Final
    pais TEXT DEFAULT 'AO',
    provincia TEXT,
    cidade TEXT,
    endereco TEXT,
    telefone TEXT,
    email TEXT,
    sujeito_retencao_fonte INTEGER DEFAULT 0,  -- 1 = Empresa retém 6.5% no pagamento
    limite_credito REAL DEFAULT 0.00,
    saldo_devedor REAL DEFAULT 0.00,
    modo_pagamento_padrao_id INTEGER,
    observacoes TEXT,
    ativo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT OR IGNORE INTO clientes (id, codigo, tipo_entidade, nome_razao_social, nif) 
VALUES (1, 'CLI-9999', 'PESSOA', 'Consumidor Final', '999999999');

-- ------------------------------------------------------------------------------
-- 6. UNIDADES DE MEDIDA, CATEGORIAS E PRODUTOS/SERVIÇOS
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS unidades_medida (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    sigla TEXT NOT NULL UNIQUE,                -- Ex: UN, KG, LTR, CX, MTR
    nome TEXT NOT NULL
);

INSERT OR IGNORE INTO unidades_medida (id, sigla, nome) VALUES 
(1, 'UN', 'Unidade'), (2, 'KG', 'Quilograma'), (3, 'CX', 'Caixa'), (4, 'SERVICO', 'Serviço');

CREATE TABLE IF NOT EXISTS produto_categorias (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nome TEXT NOT NULL,
    descricao TEXT,
    ativo INTEGER DEFAULT 1
);

CREATE TABLE IF NOT EXISTS produtos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    categoria_id INTEGER,
    unidade_medida_id INTEGER DEFAULT 1,
    codigo_barras TEXT UNIQUE,
    codigo_interno TEXT UNIQUE NOT NULL,       -- Código único exigido pelo SAF-T
    nome TEXT NOT NULL,
    descricao TEXT,
    tipo TEXT DEFAULT 'P',                    -- 'P' = Produto, 'S' = Serviço
    
    -- Preços e Margens
    preco_custo REAL DEFAULT 0.00,
    preco_venda REAL NOT NULL,
    margem_lucro_pct REAL DEFAULT 0.00,       -- Margem teórica (%)
    
    -- Fiscal AGT (Taxa de IVA e Motivos legais de Isenção)
    taxa_iva REAL DEFAULT 14.00,              -- 14%, 7%, 5%, 0%
    codigo_isencao_iva TEXT,                  -- Ex: M02, M04, M10, M12, M16
    motivo_isencao_texto TEXT,                -- Ex: Isento nos termos do artigo 12.º do CIVA
    sujeito_retencao INTEGER DEFAULT 0,       -- 1 = É um serviço sujeito a retenção de 6.5%
    
    -- Controlo de Estoque
    controla_estoque INTEGER DEFAULT 1,       -- 1 = Controla, 0 = Serviço/Digital
    stock_atual REAL DEFAULT 0.00,            -- Soma global de todos os armazéns
    stock_minimo REAL DEFAULT 0.00,
    permite_venda_sem_stock INTEGER DEFAULT 0,
    
    imagem_path TEXT,
    ativo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (categoria_id) REFERENCES produto_categorias(id),
    FOREIGN KEY (unidade_medida_id) REFERENCES unidades_medida(id)
);

-- Estoque por Armazém (Multiarmazém)
CREATE TABLE IF NOT EXISTS produto_armazem_estoque (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    produto_id INTEGER NOT NULL,
    armazem_id INTEGER NOT NULL,
    quantidade REAL DEFAULT 0.00,
    UNIQUE(produto_id, armazem_id),
    FOREIGN KEY (produto_id) REFERENCES produtos(id) ON DELETE CASCADE,
    FOREIGN KEY (armazem_id) REFERENCES armazens(id)
);

-- Movimentações de Estoque (Histórico e Auditoria)
CREATE TABLE IF NOT EXISTS stock_movimentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    produto_id INTEGER NOT NULL,
    armazem_id INTEGER NOT NULL,
    tipo_movimento TEXT NOT NULL,             -- 'ENTRADA', 'SAIDA', 'TRANSFERENCIA', 'AJUSTE', 'VENDA', 'DEVOLUCAO'
    quantidade REAL NOT NULL,
    quantidade_anterior REAL NOT NULL,
    quantidade_atual REAL NOT NULL,
    documento_referencia TEXT,                 -- Ex: FT 2026/12 ou Guia de Entrada #40
    utilizador_id INTEGER NOT NULL,
    observacao TEXT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (produto_id) REFERENCES produtos(id),
    FOREIGN KEY (armazem_id) REFERENCES armazens(id),
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id)
);

-- ------------------------------------------------------------------------------
-- 7. SÉRIES E DOCUMENTOS FISCAIS (SEGUNDO PADRÃO AGT)
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS series_documentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tipo_documento TEXT NOT NULL,              -- 'FT' (Fatura), 'FR' (Fatura-Recibo), 'PP' (Proforma), 'NC' (Nota Crédito), 'ND' (Nota Débito), 'GR' (Guia Remessa), 'OR' (Orçamento)
    serie TEXT NOT NULL,                       -- Ex: '2026'
    sequencia_atual INTEGER DEFAULT 0,
    ativo INTEGER DEFAULT 1,
    UNIQUE(tipo_documento, serie)
);

-- Tabela Principal de Cabeçalho de Documentos (Faturas, Vendas, Notas de Crédito, etc.)
CREATE TABLE IF NOT EXISTS documentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tipo_documento TEXT NOT NULL,              -- FT, FR, PP, NC, ND, GR, OR
    serie TEXT NOT NULL,
    numero_sequencial INTEGER NOT NULL,
    numero_documento TEXT UNIQUE NOT NULL,     -- Ex: FT 2026/1
    armazem_id INTEGER NOT NULL DEFAULT 1,
    cliente_id INTEGER NOT NULL,
    utilizador_id INTEGER NOT NULL,            -- Operador/Vendedor
    turno_caixa_id INTEGER,                    -- Caixa aberto onde foi efetuada a venda
    
    -- Datas
    data_emissao DATETIME NOT NULL,
    data_vencimento DATE,
    
    -- Totais Financeiros
    total_iliquido REAL DEFAULT 0.00,           -- Sumatório sem impostos e sem descontos
    total_desconto REAL DEFAULT 0.00,          -- Desconto comercial global
    total_imposto_iva REAL DEFAULT 0.00,       -- Valor do IVA
    total_retencao_fonte REAL DEFAULT 0.00,    -- Valor retido na fonte (6.5%)
    total_documento REAL DEFAULT 0.00,         -- Total a pagar (Ilíquido - Desconto + IVA - Retenção)
    total_pago REAL DEFAULT 0.00,              -- Quanto já foi pago
    saldo_pendente REAL DEFAULT 0.00,          -- Quanto falta pagar (Vendas a crédito)
    
    -- Criptografia e Regras Fiscais AGT (SAF-T AO)
    hash_rsa TEXT,                             -- Assinatura Digital RSA-2048
    hash_4_caracteres TEXT,                    -- Chave de validação (1º, 11º, 21º, 31º caracteres)
    numero_certificado TEXT,                   -- Número de Validação de Software AGT
    estado TEXT DEFAULT 'N',                   -- 'N' (Normal), 'A' (Anulado)
    motivo_anulacao TEXT,
    data_anulacao DATETIME,
    utilizador_anulacao_id INTEGER,
    
    -- Rastreabilidade de Documentos de Origem
    documento_origem_id INTEGER,               -- Se for Nota de Crédito/Recibo, aponta para a Fatura
    guia_transporte_associada TEXT,            -- Referência da Guia de Remessa
    
    -- Modo Demo
    e_demo INTEGER DEFAULT 0,                  -- 1 = Documento de Teste / Marca de Água
    
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (armazem_id) REFERENCES armazens(id),
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id),
    FOREIGN KEY (turno_caixa_id) REFERENCES turnos_caixa(id),
    FOREIGN KEY (documento_origem_id) REFERENCES documentos(id)
);

-- Linhas / Itens do Documento Fiscal
CREATE TABLE IF NOT EXISTS documento_itens (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    documento_id INTEGER NOT NULL,
    produto_id INTEGER NOT NULL,
    codigo_produto TEXT NOT NULL,
    descricao_produto TEXT NOT NULL,
    quantidade REAL NOT NULL,
    preco_unitario REAL NOT NULL,
    preco_custo_historico REAL DEFAULT 0.00,    -- Grava o custo no momento da venda para auditoria de lucro
    desconto_percentual REAL DEFAULT 0.00,
    valor_desconto REAL DEFAULT 0.00,
    taxa_iva REAL DEFAULT 14.00,
    valor_iva REAL DEFAULT 0.00,
    codigo_isencao_iva TEXT,                   -- Replicado do produto no momento do corte da fatura
    sujeito_retencao INTEGER DEFAULT 0,
    valor_retencao_fonte REAL DEFAULT 0.00,
    total_linha REAL NOT NULL,                 -- Total com IVA
    FOREIGN KEY (documento_id) REFERENCES documentos(id) ON DELETE CASCADE,
    FOREIGN KEY (produto_id) REFERENCES produtos(id)
);

-- ------------------------------------------------------------------------------
-- 8. FORMAS DE PAGAMENTO, RECIBOS E CONTA CORRENTE
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS formas_pagamento (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    codigo TEXT UNIQUE NOT NULL,               -- 'NUMERARIO', 'TPA', 'TRANSFERENCIA', 'CREDITO'
    nome TEXT NOT NULL,
    exige_conta_bancaria INTEGER DEFAULT 0,    -- 1 se for TPA ou Transferência
    ativo INTEGER DEFAULT 1
);

INSERT OR IGNORE INTO formas_pagamento (id, codigo, nome, exige_conta_bancaria) VALUES 
(1, 'NUMERARIO', 'Dinheiro / Numerário', 0),
(2, 'TPA', 'TPA / Cartão Multicaixa', 1),
(3, 'TRANSFERENCIA', 'Transferência Bancária', 1),
(4, 'CREDITO', 'Venda a Crédito', 0);

-- Pagamentos Efetuados no Ato da Fatura ou Recibo Posterior
CREATE TABLE IF NOT EXISTS pagamentos_documentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    documento_id INTEGER NOT NULL,
    forma_pagamento_id INTEGER NOT NULL,
    conta_bancaria_id INTEGER,                 -- Conta de destino se for TPA ou Transferência
    turno_caixa_id INTEGER,                     -- Caixa onde entrou o dinheiro
    valor_pago REAL NOT NULL,
    referencia_transacao TEXT,                  -- Nº de Talão de TPA ou Comprovativo de Transferência
    data_pagamento DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (documento_id) REFERENCES documentos(id) ON DELETE CASCADE,
    FOREIGN KEY (forma_pagamento_id) REFERENCES formas_pagamento(id),
    FOREIGN KEY (conta_bancaria_id) REFERENCES contas_bancarias(id),
    FOREIGN KEY (turno_caixa_id) REFERENCES turnos_caixa(id)
);

-- Recibos Individuais (Para liquidação de faturas a crédito)
CREATE TABLE IF NOT EXISTS recibos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    numero_recibo TEXT UNIQUE NOT NULL,        -- Ex: RC 2026/1
    cliente_id INTEGER NOT NULL,
    utilizador_id INTEGER NOT NULL,
    data_emissao DATETIME NOT NULL,
    valor_total_recibo REAL NOT NULL,
    hash_rsa TEXT,                             -- Recibos também são assinados em SAF-T
    hash_4_caracteres TEXT,
    estado TEXT DEFAULT 'N',                   -- 'N' Normal, 'A' Anulado
    e_demo INTEGER DEFAULT 0,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id)
);

-- ------------------------------------------------------------------------------
-- 9. GESTÃO DE TURNOS / FECHO DE CAIXA (POS)
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS turnos_caixa (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    utilizador_id INTEGER NOT NULL,            -- Operador responsável
    data_abertura DATETIME NOT NULL,
    data_fecho DATETIME,
    valor_inicial REAL DEFAULT 0.00,           -- Fundo de maneio / Troco inicial
    
    -- Totais Calculados pelo Sistema
    total_vendas_dinheiro REAL DEFAULT 0.00,
    total_vendas_tpa REAL DEFAULT 0.00,
    total_vendas_transferencia REAL DEFAULT 0.00,
    total_entradas_manual REAL DEFAULT 0.00,    -- Suprimentos de Caixa
    total_saidas_manual REAL DEFAULT 0.00,      -- Sangrias / Despesas de Caixa
    
    -- Validação do Fecho
    valor_fecho_informado REAL DEFAULT 0.00,   -- Valor físico contado pelo operador
    valor_fecho_sistema REAL DEFAULT 0.00,     -- Valor esperado pelo sistema
    quebra_caixa REAL DEFAULT 0.00,            -- Diferença (Diferença Positiva/Sobra ou Negativa/Falta)
    observacao_fecho TEXT,
    estado TEXT DEFAULT 'ABERTO',              -- 'ABERTO', 'FECHADO'
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id)
);

-- Sangrias e Suprimentos de Caixa
CREATE TABLE IF NOT EXISTS turnos_caixa_movimentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    turno_caixa_id INTEGER NOT NULL,
    tipo TEXT NOT NULL,                        -- 'SUPRIMENTO' (Entrada) ou 'SANGRIA' (Saída)
    valor REAL NOT NULL,
    descricao TEXT NOT NULL,
    utilizador_id INTEGER NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (turno_caixa_id) REFERENCES turnos_caixa(id),
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id)
);

-- ------------------------------------------------------------------------------
-- 10. TESOURARIA E FLUXO DE CAIXA GLOBAL
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS tesouraria_categorias (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tipo TEXT NOT NULL,                        -- 'ENTRADA' ou 'SAIDA'
    nome TEXT NOT NULL                         -- Ex: Pagamento Fornecedor, Salários, Renda, Vendas
);

CREATE TABLE IF NOT EXISTS tesouraria_movimentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tipo TEXT NOT NULL,                        -- 'ENTRADA' ou 'SAIDA'
    categoria_id INTEGER,
    valor REAL NOT NULL,
    forma_pagamento_id INTEGER NOT NULL,
    conta_bancaria_id INTEGER,                 -- Nulo se for dinheiro do caixa físico
    documento_id INTEGER,                      -- Vinculado a uma Fatura se aplicável
    fornecedor_id INTEGER,                     -- Vinculado a uma Compra
    descricao TEXT NOT NULL,
    utilizador_id INTEGER NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (categoria_id) REFERENCES tesouraria_categorias(id),
    FOREIGN KEY (forma_pagamento_id) REFERENCES formas_pagamento(id),
    FOREIGN KEY (conta_bancaria_id) REFERENCES contas_bancarias(id),
    FOREIGN KEY (documento_id) REFERENCES documentos(id),
    FOREIGN KEY (fornecedor_id) REFERENCES fornecedores(id),
    FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id)
);

-- ------------------------------------------------------------------------------
-- 11. MATRIZ DE PERMISSÕES E NÍVEIS DE ACESSO
-- ------------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS perfis_permissoes (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    perfil_id INTEGER NOT NULL,
    modulo TEXT NOT NULL DEFAULT 'comercial',
    acao TEXT NOT NULL,                         -- Ex: 'emitir_fatura', 'anular_fatura', 'dar_desconto_extra', 'fechar_caixa', 'ver_margem_lucro'
    permitido INTEGER DEFAULT 0,
    UNIQUE(perfil_id, modulo, acao),
    FOREIGN KEY (perfil_id) REFERENCES perfis_acesso(id) ON DELETE CASCADE
);