-- Módulo Gestor Contratos - Tabelas principais
-- Inspirado no DocuSign para gestão completa de contratos eletrônicos

-- Tabela de modelos/templates de contratos
CREATE TABLE IF NOT EXISTS contratos_modelos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Dados do modelo
    nome VARCHAR(255) NOT NULL,
    descricao TEXT NULL,
    categoria VARCHAR(100) NULL, -- venda, locacao, servico, parceria, etc.
    
    -- Conteúdo do modelo
    conteudo_html LONGTEXT NOT NULL, -- HTML do contrato com variáveis
    variaveis_json JSON NULL, -- Lista de variáveis disponíveis no modelo
    
    -- Configurações
    ativo BOOLEAN DEFAULT TRUE,
    versao INT DEFAULT 1,
    modelo_pai_id BIGINT UNSIGNED NULL, -- Para controle de versões
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    created_by INT NULL,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_categoria (categoria),
    INDEX idx_ativo (ativo),
    FOREIGN KEY (modelo_pai_id) REFERENCES contratos_modelos(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de contratos
CREATE TABLE IF NOT EXISTS contratos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Identificação
    numero VARCHAR(50) NOT NULL, -- Número único do contrato
    titulo VARCHAR(255) NOT NULL,
    tipo VARCHAR(100) NOT NULL, -- venda, locacao, servico, etc.
    
    -- Relacionamentos
    modelo_id BIGINT UNSIGNED NULL,
    cliente_id BIGINT UNSIGNED NULL, -- ID do cliente no sistema
    fornecedor_id BIGINT UNSIGNED NULL, -- ID do fornecedor no sistema
    venda_id BIGINT UNSIGNED NULL, -- ID do pedido de venda
    financeiro_id BIGINT UNSIGNED NULL, -- ID da conta a receber/pagar
    
    -- Conteúdo
    conteudo_html LONGTEXT NOT NULL, -- HTML final do contrato (variáveis preenchidas)
    variaveis_preenchidas_json JSON NULL, -- Valores das variáveis preenchidas
    
    -- Status
    status ENUM('rascunho', 'pendente_assinatura', 'assinado', 'expirado', 'cancelado', 'arquivado') DEFAULT 'rascunho',
    
    -- Datas
    data_inicio DATE NULL,
    data_fim DATE NULL,
    data_vencimento DATE NULL, -- Para renovação automática
    data_expiracao DATETIME NULL, -- Data de expiração para assinatura
    
    -- Valores
    valor_total DECIMAL(18,2) NULL,
    valor_parcela DECIMAL(18,2) NULL,
    numero_parcelas INT NULL,
    
    -- Assinatura
    assinatura_digital TEXT NULL, -- Hash da assinatura digital
    certificado_digital TEXT NULL, -- Certificado usado na assinatura
    data_assinatura DATETIME NULL,
    
    -- Metadados
    observacoes TEXT NULL,
    tags JSON NULL, -- Tags para organização
    anexos JSON NULL, -- Lista de anexos
    
    -- Auditoria
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    created_by INT NULL,
    arquivado_at DATETIME NULL,
    arquivado_by INT NULL,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_numero (numero),
    INDEX idx_status (status),
    INDEX idx_cliente (cliente_id),
    INDEX idx_fornecedor (fornecedor_id),
    INDEX idx_venda (venda_id),
    INDEX idx_data_vencimento (data_vencimento),
    INDEX idx_data_expiracao (data_expiracao),
    UNIQUE KEY uk_tenant_numero (tenant_id, numero),
    FOREIGN KEY (modelo_id) REFERENCES contratos_modelos(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de signatários (pessoas que devem assinar o contrato)
CREATE TABLE IF NOT EXISTS contratos_signatarios (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    contrato_id BIGINT UNSIGNED NOT NULL,
    
    -- Dados do signatário
    nome VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL,
    cpf_cnpj VARCHAR(18) NULL,
    telefone VARCHAR(20) NULL,
    
    -- Tipo de signatário
    tipo ENUM('interno', 'externo', 'testemunha') DEFAULT 'externo',
    user_id INT NULL, -- Se for usuário interno do sistema
    
    -- Ordem de assinatura
    ordem INT NOT NULL DEFAULT 1,
    
    -- Status de assinatura
    status ENUM('pendente', 'assinado', 'recusado', 'expirado') DEFAULT 'pendente',
    data_assinatura DATETIME NULL,
    ip_assinatura VARCHAR(45) NULL,
    user_agent TEXT NULL,
    
    -- Assinatura
    assinatura_digital TEXT NULL, -- Hash da assinatura
    assinatura_imagem TEXT NULL, -- Imagem da assinatura (base64)
    certificado_digital TEXT NULL,
    
    -- Autenticação
    token_acesso VARCHAR(255) NULL, -- Token único para acesso ao contrato
    token_expiracao DATETIME NULL,
    metodo_autenticacao ENUM('email', 'sms', 'token', 'certificado') DEFAULT 'email',
    
    -- Notificações
    email_enviado BOOLEAN DEFAULT FALSE,
    email_enviado_em DATETIME NULL,
    lembretes_enviados INT DEFAULT 0,
    ultimo_lembrete DATETIME NULL,
    
    -- Metadados
    observacoes TEXT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_contrato (contrato_id),
    INDEX idx_email (email),
    INDEX idx_status (status),
    INDEX idx_token (token_acesso),
    INDEX idx_ordem (ordem),
    FOREIGN KEY (contrato_id) REFERENCES contratos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de histórico de ações (auditoria)
CREATE TABLE IF NOT EXISTS contratos_historico (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    contrato_id BIGINT UNSIGNED NOT NULL,
    
    -- Ação realizada
    acao VARCHAR(100) NOT NULL, -- criado, editado, enviado, assinado, cancelado, etc.
    descricao TEXT NULL,
    
    -- Usuário que realizou a ação
    user_id INT NULL,
    user_nome VARCHAR(255) NULL,
    user_email VARCHAR(255) NULL,
    
    -- Dados da ação
    dados_antes_json JSON NULL,
    dados_depois_json JSON NULL,
    ip_address VARCHAR(45) NULL,
    user_agent TEXT NULL,
    
    -- Timestamp
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_contrato (contrato_id),
    INDEX idx_acao (acao),
    INDEX idx_user (user_id),
    INDEX idx_created (created_at),
    FOREIGN KEY (contrato_id) REFERENCES contratos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de anexos/documentos
CREATE TABLE IF NOT EXISTS contratos_anexos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    contrato_id BIGINT UNSIGNED NOT NULL,
    
    -- Dados do anexo
    nome_arquivo VARCHAR(255) NOT NULL,
    tipo_arquivo VARCHAR(100) NULL,
    tamanho BIGINT NULL,
    caminho VARCHAR(500) NOT NULL, -- Caminho do arquivo no storage
    
    -- Metadados
    descricao TEXT NULL,
    tipo ENUM('anexo', 'assinatura', 'certificado', 'outro') DEFAULT 'anexo',
    
    -- Auditoria
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_by INT NULL,
    
    INDEX idx_contrato (contrato_id),
    INDEX idx_tipo (tipo),
    FOREIGN KEY (contrato_id) REFERENCES contratos(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de configurações do módulo
CREATE TABLE IF NOT EXISTS contratos_config (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Assinatura digital própria (inspirada no DocuSign, mas implementada internamente)
    usar_assinatura_digital BOOLEAN DEFAULT TRUE,
    usar_certificado_icp_brasil BOOLEAN DEFAULT FALSE,
    
    -- Configurações gerais
    dias_expiracao INT DEFAULT 30, -- Dias para expiração de contrato não assinado
    enviar_notificacoes BOOLEAN DEFAULT TRUE,
    enviar_lembretes BOOLEAN DEFAULT TRUE,
    dias_lembrete INT DEFAULT 3, -- Dias antes de enviar lembrete
    max_lembretes INT DEFAULT 3, -- Número máximo de lembretes
    
    -- Segurança
    requer_certificado_digital BOOLEAN DEFAULT FALSE,
    criptografar_arquivos BOOLEAN DEFAULT TRUE,
    hash_algoritmo VARCHAR(50) DEFAULT 'sha256',
    
    -- Renovação automática
    renovacao_automatica BOOLEAN DEFAULT FALSE,
    dias_antes_renovacao INT DEFAULT 30,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    UNIQUE KEY uk_tenant (tenant_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de notificações enviadas
CREATE TABLE IF NOT EXISTS contratos_notificacoes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    contrato_id BIGINT UNSIGNED NOT NULL,
    signatario_id BIGINT UNSIGNED NULL,
    
    -- Tipo de notificação
    tipo ENUM('envio', 'lembrete', 'assinado', 'expirado', 'cancelado') NOT NULL,
    
    -- Dados do envio
    destinatario_email VARCHAR(255) NOT NULL,
    assunto VARCHAR(255) NOT NULL,
    corpo_html LONGTEXT NOT NULL,
    
    -- Status
    status ENUM('pendente', 'enviado', 'entregue', 'falha') DEFAULT 'pendente',
    enviado_em DATETIME NULL,
    entregue_em DATETIME NULL,
    erro TEXT NULL,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_contrato (contrato_id),
    INDEX idx_signatario (signatario_id),
    INDEX idx_tipo (tipo),
    INDEX idx_status (status),
    FOREIGN KEY (contrato_id) REFERENCES contratos(id) ON DELETE CASCADE,
    FOREIGN KEY (signatario_id) REFERENCES contratos_signatarios(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela de renovação de contratos
CREATE TABLE IF NOT EXISTS contratos_renovacoes (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    contrato_original_id BIGINT UNSIGNED NOT NULL,
    contrato_novo_id BIGINT UNSIGNED NULL,
    
    -- Dados da renovação
    data_renovacao DATE NOT NULL,
    motivo TEXT NULL,
    manter_termos BOOLEAN DEFAULT TRUE,
    
    -- Status
    status ENUM('pendente', 'aprovado', 'rejeitado', 'cancelado') DEFAULT 'pendente',
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_by INT NULL,
    
    INDEX idx_original (contrato_original_id),
    INDEX idx_novo (contrato_novo_id),
    INDEX idx_status (status),
    FOREIGN KEY (contrato_original_id) REFERENCES contratos(id) ON DELETE CASCADE,
    FOREIGN KEY (contrato_novo_id) REFERENCES contratos(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

