-- CreateTable
CREATE TABLE `empresas` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `nome` VARCHAR(150) NOT NULL,
    `cnpj` VARCHAR(14) NOT NULL,
    `email` VARCHAR(150) NULL,
    `telefone` VARCHAR(20) NULL,
    `celular` VARCHAR(20) NULL,
    `status` ENUM('ativo', 'inativo') NOT NULL DEFAULT 'ativo',
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `atualizado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `excluido_em` DATETIME(0) NULL,

    UNIQUE INDEX `empresas_cnpj_key`(`cnpj`),
    INDEX `idx_empresas_nome`(`nome`),
    INDEX `idx_empresas_status`(`status`),
    INDEX `idx_empresas_email`(`email`),
    INDEX `idx_empresas_excluido_em`(`excluido_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `perfis` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `nome` VARCHAR(100) NOT NULL,
    `codigo` VARCHAR(50) NOT NULL,
    `descricao` VARCHAR(255) NULL,
    `status` ENUM('ativo', 'inativo') NOT NULL DEFAULT 'ativo',
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `atualizado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `excluido_em` DATETIME(0) NULL,

    UNIQUE INDEX `perfis_nome_key`(`nome`),
    UNIQUE INDEX `perfis_codigo_key`(`codigo`),
    INDEX `idx_perfis_status`(`status`),
    INDEX `idx_perfis_excluido_em`(`excluido_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `usuarios` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `empresa_id` BIGINT UNSIGNED NOT NULL,
    `perfil_id` BIGINT UNSIGNED NOT NULL,
    `nome` VARCHAR(150) NOT NULL,
    `telefone` VARCHAR(20) NULL,
    `celular` VARCHAR(20) NULL,
    `email` VARCHAR(150) NOT NULL,
    `senha_hash` VARCHAR(255) NOT NULL,
    `status` ENUM('ativo', 'inativo', 'bloqueado') NOT NULL DEFAULT 'ativo',
    `email_verificado_em` DATETIME(0) NULL,
    `ultimo_login_em` DATETIME(0) NULL,
    `tentativas_login` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `bloqueado_ate` DATETIME(0) NULL,
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `atualizado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `excluido_em` DATETIME(0) NULL,

    UNIQUE INDEX `usuarios_email_key`(`email`),
    INDEX `idx_usuarios_empresa_id`(`empresa_id`),
    INDEX `idx_usuarios_perfil_id`(`perfil_id`),
    INDEX `idx_usuarios_nome`(`nome`),
    INDEX `idx_usuarios_status`(`status`),
    INDEX `idx_usuarios_excluido_em`(`excluido_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `refresh_tokens` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `usuario_id` BIGINT UNSIGNED NOT NULL,
    `token_hash` VARCHAR(255) NOT NULL,
    `expira_em` DATETIME(0) NOT NULL,
    `revogado_em` DATETIME(0) NULL,
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
    `ip_address` VARCHAR(45) NULL,
    `user_agent` VARCHAR(500) NULL,

    UNIQUE INDEX `refresh_tokens_token_hash_key`(`token_hash`),
    INDEX `idx_refresh_tokens_usuario_id`(`usuario_id`),
    INDEX `idx_refresh_tokens_expira_em`(`expira_em`),
    INDEX `idx_refresh_tokens_revogado_em`(`revogado_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `recuperacoes_senha` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `usuario_id` BIGINT UNSIGNED NOT NULL,
    `token_hash` VARCHAR(255) NOT NULL,
    `expira_em` DATETIME(0) NOT NULL,
    `utilizado_em` DATETIME(0) NULL,
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),

    UNIQUE INDEX `recuperacoes_senha_token_hash_key`(`token_hash`),
    INDEX `idx_recuperacoes_senha_usuario_id`(`usuario_id`),
    INDEX `idx_recuperacoes_senha_expira_em`(`expira_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `auditoria_logs` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `usuario_id` BIGINT UNSIGNED NULL,
    `entidade` VARCHAR(100) NOT NULL,
    `entidade_id` BIGINT UNSIGNED NULL,
    `acao` VARCHAR(50) NOT NULL,
    `dados_anteriores` JSON NULL,
    `dados_novos` JSON NULL,
    `ip_address` VARCHAR(45) NULL,
    `criado_em` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),

    INDEX `idx_auditoria_usuario_id`(`usuario_id`),
    INDEX `idx_auditoria_entidade`(`entidade`),
    INDEX `idx_auditoria_entidade_id`(`entidade_id`),
    INDEX `idx_auditoria_acao`(`acao`),
    INDEX `idx_auditoria_criado_em`(`criado_em`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `usuarios` ADD CONSTRAINT `usuarios_empresa_id_fkey` FOREIGN KEY (`empresa_id`) REFERENCES `empresas`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `usuarios` ADD CONSTRAINT `usuarios_perfil_id_fkey` FOREIGN KEY (`perfil_id`) REFERENCES `perfis`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `refresh_tokens` ADD CONSTRAINT `refresh_tokens_usuario_id_fkey` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `recuperacoes_senha` ADD CONSTRAINT `recuperacoes_senha_usuario_id_fkey` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `auditoria_logs` ADD CONSTRAINT `auditoria_logs_usuario_id_fkey` FOREIGN KEY (`usuario_id`) REFERENCES `usuarios`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
