SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE IF NOT EXISTS system_settings (
    setting_key VARCHAR(100) NOT NULL PRIMARY KEY,
    setting_value TEXT NULL,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS estado (
    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
    estado VARCHAR(50) NOT NULL UNIQUE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS usuario (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(180) NOT NULL,
    email VARCHAR(190) NOT NULL UNIQUE,
    senha VARCHAR(255) NOT NULL,
    telefone VARCHAR(40) NULL,
    genero VARCHAR(30) NULL,
    nascimento DATE NULL,
    endereco VARCHAR(500) NULL,
    imgPath VARCHAR(500) NULL DEFAULT '/assets/img/u/default.png',
    tipo VARCHAR(40) NOT NULL DEFAULT 'operador',
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    dataCreated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_usuario_estado (estado),
    CONSTRAINT fk_usuario_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS empresa (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(200) NOT NULL,
    endereco VARCHAR(500) NULL,
    nif VARCHAR(50) NULL UNIQUE,
    telefone VARCHAR(100) NULL,
    email VARCHAR(190) NULL,
    website VARCHAR(255) NULL,
    img VARCHAR(500) NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS categorias (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(160) NOT NULL UNIQUE,
    descricao TEXT NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    INDEX idx_categorias_estado (estado),
    CONSTRAINT fk_categorias_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS moedas (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    codigo CHAR(3) NULL UNIQUE,
    nome VARCHAR(100) NOT NULL UNIQUE,
    descricao VARCHAR(255) NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    CONSTRAINT fk_moedas_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS fornecedor (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(200) NOT NULL,
    nif VARCHAR(50) NULL,
    telefone VARCHAR(100) NULL,
    email VARCHAR(190) NULL,
    endereco VARCHAR(500) NULL,
    site VARCHAR(255) NULL,
    pais VARCHAR(100) NULL DEFAULT 'Angola',
    provincia VARCHAR(100) NULL,
    observacao TEXT NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_fornecedor_estado (estado),
    CONSTRAINT fk_fornecedor_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS produtos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(50) NOT NULL,
    idFor BIGINT UNSIGNED NULL,
    produto VARCHAR(200) NOT NULL,
    preco DECIMAL(18,2) NOT NULL DEFAULT 0,
    precoCompra DECIMAL(18,2) NOT NULL DEFAULT 0,
    descricao TEXT NULL,
    categoria BIGINT UNSIGNED NULL,
    unidade VARCHAR(30) NOT NULL DEFAULT 'un',
    ic DECIMAL(8,2) NOT NULL DEFAULT 0,
    validade DATE NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_produtos_uid_codigo (uid, codigo),
    INDEX idx_produtos_uid_estado (uid, estado),
    CONSTRAINT fk_produtos_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE,
    CONSTRAINT fk_produtos_fornecedor FOREIGN KEY (idFor) REFERENCES fornecedor(id) ON DELETE SET NULL,
    CONSTRAINT fk_produtos_categoria FOREIGN KEY (categoria) REFERENCES categorias(id) ON DELETE SET NULL,
    CONSTRAINT fk_produtos_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS stock (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NOT NULL,
    idPro BIGINT UNSIGNED NOT NULL,
    idFor BIGINT UNSIGNED NULL,
    qtd DECIMAL(18,3) NOT NULL DEFAULT 0,
    desconto DECIMAL(8,2) NOT NULL DEFAULT 0,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_stock_uid_produto (uid, idPro),
    CONSTRAINT fk_stock_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE,
    CONSTRAINT fk_stock_produto FOREIGN KEY (idPro) REFERENCES produtos(id) ON DELETE CASCADE,
    CONSTRAINT fk_stock_fornecedor FOREIGN KEY (idFor) REFERENCES fornecedor(id) ON DELETE SET NULL,
    CONSTRAINT fk_stock_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS servicos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    cid BIGINT UNSIGNED NULL,
    codigo VARCHAR(50) NULL UNIQUE,
    nome VARCHAR(200) NOT NULL,
    preco DECIMAL(18,2) NOT NULL DEFAULT 0,
    unidade VARCHAR(30) NOT NULL DEFAULT 'un',
    descricao TEXT NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    dataCreated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_servicos_categoria FOREIGN KEY (cid) REFERENCES categorias(id) ON DELETE SET NULL,
    CONSTRAINT fk_servicos_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS cliente (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NULL,
    nome VARCHAR(200) NOT NULL,
    caracteristica VARCHAR(50) NULL,
    email VARCHAR(190) NULL,
    telefone VARCHAR(100) NULL,
    endereco VARCHAR(500) NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    nif VARCHAR(50) NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_cliente_uid_nome (uid, nome),
    CONSTRAINT fk_cliente_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE,
    CONSTRAINT fk_cliente_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS factura (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    cid BIGINT UNSIGNED NOT NULL,
    eid BIGINT UNSIGNED NOT NULL,
    uid BIGINT UNSIGNED NOT NULL,
    numero VARCHAR(80) NOT NULL,
    desconto DECIMAL(18,2) NOT NULL DEFAULT 0,
    retencao DECIMAL(18,2) NOT NULL DEFAULT 0,
    `local` VARCHAR(180) NULL,
    serie VARCHAR(50) NULL,
    moeda VARCHAR(10) NOT NULL DEFAULT 'AOA',
    metodo_pagamento_id SMALLINT UNSIGNED NULL,
    observacao TEXT NULL,
    referencia VARCHAR(100) NULL,
    iva DECIMAL(18,2) NOT NULL DEFAULT 0,
    total_iliquido DECIMAL(18,2) NOT NULL DEFAULT 0,
    tipo VARCHAR(50) NOT NULL,
    total_pagar DECIMAL(18,2) NOT NULL DEFAULT 0,
    dataCreated DATETIME NOT NULL,
    dataValidade DATE NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    UNIQUE KEY uq_factura_empresa_numero (eid, numero, serie),
    INDEX idx_factura_uid_data (uid, dataCreated),
    CONSTRAINT fk_factura_cliente FOREIGN KEY (cid) REFERENCES cliente(id),
    CONSTRAINT fk_factura_empresa FOREIGN KEY (eid) REFERENCES empresa(id),
    CONSTRAINT fk_factura_usuario FOREIGN KEY (uid) REFERENCES usuario(id),
    CONSTRAINT fk_factura_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS item (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    fid BIGINT UNSIGNED NOT NULL,
    pid BIGINT UNSIGNED NULL,
    un VARCHAR(30) NOT NULL DEFAULT 'un',
    descricao VARCHAR(500) NOT NULL,
    qtd DECIMAL(18,3) NOT NULL DEFAULT 1,
    preco DECIMAL(18,2) NOT NULL DEFAULT 0,
    desconto DECIMAL(18,2) NOT NULL DEFAULT 0,
    iva DECIMAL(18,2) NOT NULL DEFAULT 0,
    retencao DECIMAL(18,2) NOT NULL DEFAULT 0,
    total DECIMAL(18,2) NOT NULL DEFAULT 0,
    CONSTRAINT fk_item_factura FOREIGN KEY (fid) REFERENCES factura(id) ON DELETE CASCADE,
    CONSTRAINT fk_item_produto FOREIGN KEY (pid) REFERENCES produtos(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS conta (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    cid BIGINT UNSIGNED NOT NULL,
    ref VARCHAR(100) NULL,
    uid BIGINT UNSIGNED NOT NULL,
    documento VARCHAR(100) NULL,
    descricao VARCHAR(500) NULL,
    debito DECIMAL(18,2) NOT NULL DEFAULT 0,
    credito DECIMAL(18,2) NOT NULL DEFAULT 0,
    data DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    isopen TINYINT(1) NOT NULL DEFAULT 1,
    CONSTRAINT fk_conta_cliente FOREIGN KEY (cid) REFERENCES cliente(id) ON DELETE CASCADE,
    CONSTRAINT fk_conta_usuario FOREIGN KEY (uid) REFERENCES usuario(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ticket (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NOT NULL,
    assunto VARCHAR(200) NOT NULL,
    mensagem TEXT NOT NULL,
    prioridade VARCHAR(30) NOT NULL DEFAULT 'normal',
    filePath VARCHAR(500) NULL,
    estado VARCHAR(30) NOT NULL DEFAULT 'aberto',
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_ticket_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ticket_replies (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ticket_id BIGINT UNSIGNED NOT NULL,
    uid BIGINT UNSIGNED NOT NULL,
    mensagem TEXT NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_ticket_reply_ticket FOREIGN KEY (ticket_id) REFERENCES ticket(id) ON DELETE CASCADE,
    CONSTRAINT fk_ticket_reply_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS papeis (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    slug VARCHAR(60) NOT NULL UNIQUE,
    descricao VARCHAR(500) NULL,
    sistema TINYINT(1) NOT NULL DEFAULT 0,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_papeis_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS permissoes (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(100) NOT NULL UNIQUE,
    nome VARCHAR(140) NOT NULL,
    modulo VARCHAR(60) NOT NULL,
    descricao VARCHAR(500) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS papel_permissao (
    papel_id SMALLINT UNSIGNED NOT NULL,
    permissao_id SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY (papel_id, permissao_id),
    CONSTRAINT fk_papel_permissao_papel FOREIGN KEY (papel_id) REFERENCES papeis(id) ON DELETE CASCADE,
    CONSTRAINT fk_papel_permissao_permissao FOREIGN KEY (permissao_id) REFERENCES permissoes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS metodos_pagamento (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(100) NOT NULL,
    codigo VARCHAR(50) NOT NULL UNIQUE,
    descricao VARCHAR(255) NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    CONSTRAINT fk_metodos_pagamento_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS preferencias_usuario (
    uid BIGINT UNSIGNED NOT NULL PRIMARY KEY,
    tema VARCHAR(20) NOT NULL DEFAULT 'claro',
    moeda_codigo CHAR(3) NOT NULL DEFAULT 'AOA',
    metodo_pagamento_id SMALLINT UNSIGNED NULL,
    factura_tipo_padrao VARCHAR(20) NOT NULL DEFAULT 'FT',
    factura_serie_padrao VARCHAR(30) NULL,
    factura_validade_dias SMALLINT UNSIGNED NOT NULL DEFAULT 30,
    factura_iva_padrao DECIMAL(5,2) NOT NULL DEFAULT 14.00,
    factura_observacao_padrao TEXT NULL,
    factura_mostrar_logotipo TINYINT(1) NOT NULL DEFAULT 1,
    notificacao_email TINYINT(1) NOT NULL DEFAULT 1,
    notificacao_sistema TINYINT(1) NOT NULL DEFAULT 1,
    notificacao_seguranca TINYINT(1) NOT NULL DEFAULT 1,
    notificacao_documentos TINYINT(1) NOT NULL DEFAULT 1,
    notificacao_comercial TINYINT(1) NOT NULL DEFAULT 1,
    idioma VARCHAR(10) NOT NULL DEFAULT 'pt-AO',
    fuso_horario VARCHAR(64) NOT NULL DEFAULT 'Africa/Luanda',
    formato_data VARCHAR(20) NOT NULL DEFAULT 'dd/mm/yyyy',
    pagina_inicial VARCHAR(120) NOT NULL DEFAULT '/',
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_preferencias_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE,
    CONSTRAINT fk_preferencias_moeda FOREIGN KEY (moeda_codigo) REFERENCES moedas(codigo),
    CONSTRAINT fk_preferencias_metodo FOREIGN KEY (metodo_pagamento_id) REFERENCES metodos_pagamento(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS configuracao_empresa (
    empresa_id BIGINT UNSIGNED NOT NULL PRIMARY KEY,
    razao_social VARCHAR(220) NULL,
    pais VARCHAR(100) NOT NULL DEFAULT 'Angola',
    provincia VARCHAR(100) NULL,
    cidade VARCHAR(100) NULL,
    codigo_postal VARCHAR(30) NULL,
    banco VARCHAR(160) NULL,
    iban VARCHAR(80) NULL,
    swift VARCHAR(30) NULL,
    regime_fiscal VARCHAR(100) NULL,
    reparticao_fiscal VARCHAR(160) NULL,
    numero_contribuinte VARCHAR(80) NULL,
    iva_padrao DECIMAL(5,2) NOT NULL DEFAULT 14.00,
    motivo_isencao VARCHAR(500) NULL,
    rodape_documentos TEXT NULL,
    termos_documentos TEXT NULL,
    moeda_padrao CHAR(3) NOT NULL DEFAULT 'AOA',
    metodo_pagamento_padrao SMALLINT UNSIGNED NULL,
    email_documentos VARCHAR(190) NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_configuracao_empresa FOREIGN KEY (empresa_id) REFERENCES empresa(id) ON DELETE CASCADE,
    CONSTRAINT fk_configuracao_empresa_moeda FOREIGN KEY (moeda_padrao) REFERENCES moedas(codigo),
    CONSTRAINT fk_configuracao_empresa_pagamento FOREIGN KEY (metodo_pagamento_padrao) REFERENCES metodos_pagamento(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS series_documentos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    empresa_id BIGINT UNSIGNED NOT NULL,
    tipo VARCHAR(20) NOT NULL,
    codigo VARCHAR(30) NOT NULL,
    proximo_numero BIGINT UNSIGNED NOT NULL DEFAULT 1,
    prefixo VARCHAR(40) NULL,
    estado TINYINT UNSIGNED NOT NULL DEFAULT 1,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modificado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_series_empresa_tipo_codigo (empresa_id, tipo, codigo),
    CONSTRAINT fk_series_empresa FOREIGN KEY (empresa_id) REFERENCES empresa(id) ON DELETE CASCADE,
    CONSTRAINT fk_series_estado FOREIGN KEY (estado) REFERENCES estado(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS sessoes_usuario (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NOT NULL,
    jti_hash CHAR(64) NOT NULL UNIQUE,
    session_hash CHAR(64) NOT NULL,
    dispositivo VARCHAR(255) NULL,
    ip_hash CHAR(64) NULL,
    ultimo_acesso TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    expira_em DATETIME NOT NULL,
    revogada_em DATETIME NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_sessoes_usuario_ativas (uid, revogada_em, expira_em),
    CONSTRAINT fk_sessoes_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS notificacoes (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NOT NULL,
    titulo VARCHAR(180) NOT NULL,
    mensagem TEXT NOT NULL,
    tipo VARCHAR(40) NOT NULL DEFAULT 'informacao',
    link VARCHAR(500) NULL,
    lida_em DATETIME NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_notificacoes_usuario (uid, lida_em, criado),
    CONSTRAINT fk_notificacoes_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS eliminacoes_conta (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NULL,
    email_hash CHAR(64) NOT NULL,
    motivo VARCHAR(500) NULL,
    solicitado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_eliminacoes_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS actividades_utilizador (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    uid BIGINT UNSIGNED NULL,
    acao VARCHAR(100) NOT NULL,
    descricao VARCHAR(500) NOT NULL,
    metadados JSON NULL,
    ip_hash CHAR(64) NULL,
    criado TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_actividades_utilizador (uid, criado),
    CONSTRAINT fk_actividades_usuario FOREIGN KEY (uid) REFERENCES usuario(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO estado (id, estado) VALUES
    (0, 'Inactivo'),
    (1, 'Activo')
ON DUPLICATE KEY UPDATE estado = VALUES(estado);

INSERT INTO categorias (id, nome, descricao, estado) VALUES
    (1, 'Geral', 'Categoria padrão do sistema', 1)
ON DUPLICATE KEY UPDATE nome = VALUES(nome), descricao = VALUES(descricao);

INSERT INTO moedas (codigo, nome, descricao, estado) VALUES
    ('AOA', 'Kwanza', 'Moeda oficial de Angola', 1),
    ('USD', 'Dólar', 'Dólar dos Estados Unidos', 1),
    ('EUR', 'Euro', 'Moeda da União Europeia', 1)
ON DUPLICATE KEY UPDATE nome = VALUES(nome), descricao = VALUES(descricao), estado = VALUES(estado);

INSERT INTO empresa (id, nome, endereco, nif, telefone, email, website, img) VALUES
    (1, 'Analíticas', 'Luanda, Angola', NULL, NULL, NULL, NULL, '/assets/img/logo.svg')
ON DUPLICATE KEY UPDATE nome = VALUES(nome);

INSERT INTO papeis (nome, slug, descricao, sistema, estado) VALUES
    ('Administrador', 'admin', 'Acesso total ao sistema e à gestão de permissões.', 1, 1),
    ('Gestor', 'gestor', 'Gestão operacional, comercial e documental.', 1, 1),
    ('Operador', 'operador', 'Operação diária e emissão de documentos autorizados.', 1, 1)
ON DUPLICATE KEY UPDATE nome = VALUES(nome), descricao = VALUES(descricao), estado = VALUES(estado);

INSERT INTO permissoes (codigo, nome, modulo, descricao) VALUES
    ('dashboard.view', 'Ver painel', 'Painel', 'Consultar o painel principal.'),
    ('catalog.view', 'Consultar catálogo', 'Catálogo', 'Consultar produtos, serviços, categorias e fornecedores.'),
    ('catalog.manage', 'Gerir catálogo', 'Catálogo', 'Criar e alterar produtos, serviços, categorias, fornecedores e stock.'),
    ('customers.view', 'Consultar clientes', 'Clientes', 'Consultar clientes e contas correntes.'),
    ('customers.manage', 'Gerir clientes', 'Clientes', 'Criar e alterar clientes.'),
    ('documents.view', 'Consultar documentos', 'Documentos', 'Consultar documentos comerciais.'),
    ('documents.create', 'Emitir documentos', 'Documentos', 'Emitir facturas, recibos, proformas e notas de entrega.'),
    ('documents.manage', 'Gerir documentos', 'Documentos', 'Alterar estados e converter documentos.'),
    ('users.manage', 'Gerir utilizadores', 'Utilizadores', 'Consultar, activar e atribuir papéis aos utilizadores.'),
    ('roles.manage', 'Gerir papéis', 'Utilizadores', 'Criar papéis e configurar permissões.'),
    ('company.manage', 'Gerir empresa', 'Empresa', 'Alterar os dados e as preferências globais da empresa.')
ON DUPLICATE KEY UPDATE nome = VALUES(nome), modulo = VALUES(modulo), descricao = VALUES(descricao);

INSERT IGNORE INTO papel_permissao (papel_id, permissao_id)
SELECT pa.id, pe.id FROM papeis pa CROSS JOIN permissoes pe WHERE pa.slug = 'admin';

INSERT IGNORE INTO papel_permissao (papel_id, permissao_id)
SELECT pa.id, pe.id FROM papeis pa JOIN permissoes pe ON pe.codigo IN (
    'dashboard.view', 'catalog.view', 'catalog.manage', 'customers.view', 'customers.manage',
    'documents.view', 'documents.create', 'documents.manage', 'users.manage', 'company.manage'
) WHERE pa.slug = 'gestor';

INSERT IGNORE INTO papel_permissao (papel_id, permissao_id)
SELECT pa.id, pe.id FROM papeis pa JOIN permissoes pe ON pe.codigo IN (
    'dashboard.view', 'catalog.view', 'customers.view', 'customers.manage',
    'documents.view', 'documents.create'
) WHERE pa.slug = 'operador';

INSERT INTO metodos_pagamento (nome, codigo, descricao, estado) VALUES
    ('Numerário', 'numerario', 'Pagamento em dinheiro.', 1),
    ('Transferência bancária', 'transferencia', 'Pagamento por transferência bancária.', 1),
    ('TPA / Cartão', 'tpa', 'Pagamento por terminal ou cartão.', 1),
    ('Referência', 'referencia', 'Pagamento por referência.', 1)
ON DUPLICATE KEY UPDATE nome = VALUES(nome), descricao = VALUES(descricao), estado = VALUES(estado);

INSERT INTO configuracao_empresa (empresa_id, razao_social, pais, moeda_padrao, iva_padrao)
SELECT id, nome, 'Angola', 'AOA', 14.00 FROM empresa WHERE id = 1
ON DUPLICATE KEY UPDATE empresa_id = VALUES(empresa_id);

INSERT INTO series_documentos (empresa_id, tipo, codigo, prefixo, estado) VALUES
    (1, 'FT', YEAR(CURRENT_DATE), 'FT', 1),
    (1, 'FR', YEAR(CURRENT_DATE), 'FR', 1),
    (1, 'PF', YEAR(CURRENT_DATE), 'PF', 1),
    (1, 'NE', YEAR(CURRENT_DATE), 'NE', 1),
    (1, 'RC', YEAR(CURRENT_DATE), 'RC', 1)
ON DUPLICATE KEY UPDATE estado = VALUES(estado);

UPDATE usuario SET tipo = 'operador' WHERE tipo = 'user' OR tipo = '';

SET FOREIGN_KEY_CHECKS = 1;
