-- ============================================================
-- SISTEMA ERP - GESTÃO DE IMPRESSORAS XEROX/HP
-- Base de Dados MySQL/MariaDB
-- ============================================================

CREATE DATABASE IF NOT EXISTS erp_impressoras CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE erp_impressoras;

-- ============= OTPs =============
CREATE TABLE IF NOT EXISTS otps (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT NOT NULL,
    codigo VARCHAR(10) NOT NULL,
    metodo ENUM('email','sms') NOT NULL,
    expira_em DATETIME NOT NULL,
    usado TINYINT(1) DEFAULT 0,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ============= IMPRESSORAS DOS CLIENTES =============
CREATE TABLE IF NOT EXISTS impressoras (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT NOT NULL,
    marca ENUM('Xerox','HP') NOT NULL,
    modelo VARCHAR(100) NOT NULL,
    numero_serie VARCHAR(100) UNIQUE,
    localizacao VARCHAR(200),
    data_instalacao DATE,
    estado ENUM('operacional','manutencao','avariada','descomissionada') DEFAULT 'operacional',
    contador_paginas INT DEFAULT 0,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ============= TICKETS / PEDIDOS DE SERVIÇO =============
CREATE TABLE IF NOT EXISTS tickets (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numero_ticket VARCHAR(20) UNIQUE NOT NULL,
    cliente_id INT NOT NULL,
    impressora_id INT NULL,
    titulo VARCHAR(200) NOT NULL,
    descricao TEXT NOT NULL,
    tipo ENUM('manutencao','avaria','consumiveis','instalacao','outro') NOT NULL,
    prioridade ENUM('baixa','media','alta','urgente') DEFAULT 'media',
    estado ENUM('aberto','atribuido','em_andamento','aguarda_cliente','resolvido','fechado','cancelado') DEFAULT 'aberto',
    tecnico_atribuido INT NULL,
    criado_por_cliente TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    actualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    fechado_em DATETIME NULL,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (impressora_id) REFERENCES impressoras(id),
    FOREIGN KEY (tecnico_atribuido) REFERENCES utilizadores(id)
) ENGINE=InnoDB;

-- ============= ORDENS DE TRABALHO =============
CREATE TABLE IF NOT EXISTS ordens_trabalho (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numero_ot VARCHAR(20) UNIQUE NOT NULL,
    ticket_id INT NULL,
    cliente_id INT NOT NULL,
    descricao TEXT NOT NULL,
    tecnico_id INT NULL,
    estado ENUM('planeada','em_execucao','concluida','cancelada') DEFAULT 'planeada',
    data_agendada DATETIME,
    data_inicio DATETIME NULL,
    data_fim DATETIME NULL,
    relatorio TEXT,
    custo DECIMAL(12,2) DEFAULT 0,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (ticket_id) REFERENCES tickets(id),
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (tecnico_id) REFERENCES utilizadores(id)
) ENGINE=InnoDB;

-- ============= ACTUALIZAÇÕES DE TICKETS (HISTÓRICO) =============
CREATE TABLE IF NOT EXISTS ticket_actualizacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ticket_id INT NOT NULL,
    utilizador_id INT NULL,
    cliente_id INT NULL,
    accao VARCHAR(100),
    comentario TEXT,
    estado_anterior VARCHAR(50),
    estado_novo VARCHAR(50),
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ============= AGENDA DO PROPRIETÁRIO =============
CREATE TABLE IF NOT EXISTS agenda (
    id INT AUTO_INCREMENT PRIMARY KEY,
    proprietario_id INT NOT NULL,
    criado_por INT NOT NULL,
    tipo ENUM('voo','reuniao','evento','outro') NOT NULL,
    titulo VARCHAR(200) NOT NULL,
    descricao TEXT,
    local VARCHAR(200),
    data_inicio DATETIME NOT NULL,
    data_fim DATETIME,
    -- Campos específicos de voo
    voo_companhia VARCHAR(80),
    voo_numero VARCHAR(30),
    voo_origem VARCHAR(80),
    voo_destino VARCHAR(80),
    voo_partida DATETIME,
    voo_chegada DATETIME,
    -- Notificação
    notificar_whatsapp TINYINT(1) DEFAULT 1,
    notificar_sms TINYINT(1) DEFAULT 0,
    notificacao_enviada TINYINT(1) DEFAULT 0,
    estado ENUM('agendado','concluido','cancelado') DEFAULT 'agendado',
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (proprietario_id) REFERENCES utilizadores(id),
    FOREIGN KEY (criado_por) REFERENCES utilizadores(id)
) ENGINE=InnoDB;

-- ============= CHATS / CONVERSAS =============
CREATE TABLE IF NOT EXISTS conversas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titulo VARCHAR(200),
    tipo ENUM('directa','grupo','cliente') DEFAULT 'directa',
    ticket_relacionado INT NULL,
    cliente_id INT NULL,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (ticket_relacionado) REFERENCES tickets(id),
    FOREIGN KEY (cliente_id) REFERENCES clientes(id)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS conversa_participantes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    conversa_id INT NOT NULL,
    utilizador_id INT NULL,
    cliente_id INT NULL,
    adicionado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (conversa_id) REFERENCES conversas(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS mensagens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    conversa_id INT NOT NULL,
    remetente_utilizador INT NULL,
    remetente_cliente INT NULL,
    mensagem TEXT NOT NULL,
    anexo VARCHAR(255),
    lida TINYINT(1) DEFAULT 0,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (conversa_id) REFERENCES conversas(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ============= NOTIFICAÇÕES E EMAILS =============
CREATE TABLE IF NOT EXISTS notificacoes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    utilizador_id INT NULL,
    cliente_id INT NULL,
    titulo VARCHAR(200) NOT NULL,
    mensagem TEXT,
    tipo VARCHAR(50),
    link VARCHAR(255),
    lida TINYINT(1) DEFAULT 0,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS emails_enviados (
    id INT AUTO_INCREMENT PRIMARY KEY,
    para_email VARCHAR(150) NOT NULL,
    assunto VARCHAR(255),
    corpo TEXT,
    estado ENUM('pendente','enviado','falhado') DEFAULT 'pendente',
    erro TEXT,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    enviado_em DATETIME NULL
) ENGINE=InnoDB;

-- ============= LOG DE ACTIVIDADES (PARA O PROPRIETÁRIO) =============
CREATE TABLE IF NOT EXISTS log_actividades (
    id INT AUTO_INCREMENT PRIMARY KEY,
    utilizador_id INT NULL,
    cliente_id INT NULL,
    tipo_actor ENUM('utilizador','cliente') NOT NULL,
    accao VARCHAR(100) NOT NULL,
    modulo VARCHAR(50),
    detalhes TEXT,
    ip VARCHAR(45),
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_data (criado_em),
    INDEX idx_utilizador (utilizador_id)
) ENGINE=InnoDB;

-- ============= PRODUTOS / CATÁLOGO =============
CREATE TABLE IF NOT EXISTS produtos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(50) UNIQUE,
    nome VARCHAR(200) NOT NULL,
    marca ENUM('Xerox','HP','Outro') NOT NULL,
    categoria ENUM('impressora','toner','tinta','peca','acessorio') NOT NULL,
    descricao TEXT,
    preco DECIMAL(12,2) DEFAULT 0,
    stock INT DEFAULT 0,
    stock_minimo INT DEFAULT 0,
    activo TINYINT(1) DEFAULT 1,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ============= VENDAS / ENCOMENDAS =============
CREATE TABLE IF NOT EXISTS vendas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numero_factura VARCHAR(30) UNIQUE,
    cliente_id INT NOT NULL,
    vendedor_id INT NULL,
    total DECIMAL(12,2) DEFAULT 0,
    estado ENUM('orcamento','confirmada','entregue','paga','cancelada') DEFAULT 'orcamento',
    data_venda DATE,
    notas TEXT,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cliente_id) REFERENCES clientes(id),
    FOREIGN KEY (vendedor_id) REFERENCES utilizadores(id)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS venda_itens (
    id INT AUTO_INCREMENT PRIMARY KEY,
    venda_id INT NOT NULL,
    produto_id INT NOT NULL,
    quantidade INT DEFAULT 1,
    preco_unitario DECIMAL(12,2),
    subtotal DECIMAL(12,2),
    FOREIGN KEY (venda_id) REFERENCES vendas(id) ON DELETE CASCADE,
    FOREIGN KEY (produto_id) REFERENCES produtos(id)
) ENGINE=InnoDB;

-- ============= CONFIGURAÇÕES DO SISTEMA =============
CREATE TABLE IF NOT EXISTS configuracoes (
    chave VARCHAR(100) PRIMARY KEY,
    valor TEXT,
    tipo ENUM('texto','numero','booleano','cor','ficheiro','json') DEFAULT 'texto',
    categoria VARCHAR(50),
    descricao VARCHAR(255),
    actualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

INSERT INTO configuracoes (chave, valor, tipo, categoria, descricao) VALUES
('empresa_nome', 'PrintTech Angola', 'texto', 'empresa', 'Nome da empresa'),
('empresa_email', 'noreply@empresa.ao', 'texto', 'empresa', 'Email principal'),
('empresa_telefone', '+244 923 000 000', 'texto', 'empresa', 'Telefone principal'),
('empresa_morada', 'Luanda, Angola', 'texto', 'empresa', 'Morada'),
('empresa_nif', '', 'texto', 'empresa', 'NIF'),
('empresa_logo', '', 'ficheiro', 'empresa', 'Logótipo da empresa'),
('empresa_dominio', 'empresa.ao', 'texto', 'empresa', 'Domínio para emails'),
('tema_cor_primaria', '#0f172a', 'cor', 'tema', 'Cor primária'),
('tema_cor_acento', '#f97316', 'cor', 'tema', 'Cor de acento'),
('tema_cor_sucesso', '#10b981', 'cor', 'tema', 'Cor de sucesso'),
('tema_cor_erro', '#ef4444', 'cor', 'tema', 'Cor de erro'),
('tema_modo', 'claro', 'texto', 'tema', 'Modo claro/escuro'),
('smtp_host', 'smtp.empresa.ao', 'texto', 'comunicacao', 'Servidor SMTP'),
('smtp_port', '587', 'numero', 'comunicacao', 'Porta SMTP'),
('smtp_user', 'noreply@empresa.ao', 'texto', 'comunicacao', 'Utilizador SMTP'),
('smtp_pass', '', 'texto', 'comunicacao', 'Password SMTP'),
('sms_provider', 'twilio', 'texto', 'comunicacao', 'Fornecedor SMS'),
('sms_api_key', '', 'texto', 'comunicacao', 'Chave API SMS'),
('whatsapp_api_key', '', 'texto', 'comunicacao', 'Chave API WhatsApp'),
('otp_validade_minutos', '10', 'numero', 'seguranca', 'Validade OTP (minutos)'),
('sessao_duracao_horas', '8', 'numero', 'seguranca', 'Duração da sessão (horas)'),
('login_max_tentativas', '5', 'numero', 'seguranca', 'Máximo de tentativas de login'),
('manutencao_activa', '0', 'booleano', 'sistema', 'Modo manutenção');

INSERT INTO produtos (codigo, nome, marca, categoria, descricao, preco, stock, stock_minimo) VALUES
('XER-VL-C7000', 'Xerox VersaLink C7000', 'Xerox', 'impressora', 'Impressora multifunções a cores A3', 850000.00, 5, 2),
('XER-WC-6515', 'Xerox WorkCentre 6515', 'Xerox', 'impressora', 'Impressora multifunções a cores A4', 320000.00, 10, 3),
('HP-LJP-M404', 'HP LaserJet Pro M404dn', 'HP', 'impressora', 'Impressora laser monocromática', 145000.00, 15, 5),
('HP-CLJP-M283', 'HP Color LaserJet Pro M283fdw', 'HP', 'impressora', 'Multifunções a cores Wi-Fi', 285000.00, 8, 3),
('XER-TON-106R', 'Toner Xerox 106R03533 Preto', 'Xerox', 'toner', 'Toner original Xerox alta capacidade', 45000.00, 30, 10),
('HP-TON-CF258A', 'Toner HP 58A CF258A', 'HP', 'toner', 'Toner original HP LaserJet', 38000.00, 25, 10),
('HP-TIN-305', 'Tinteiro HP 305 Preto', 'HP', 'tinta', 'Tinteiro original HP', 12500.00, 50, 15);
