-- Esquema do Banco de Dados para o Sistema de Controle e Administração Financeira de Clínicas

-- Desabilitar verificações de chave estrangeira temporariamente para evitar problemas de ordem de criação
SET FOREIGN_KEY_CHECKS = 0;

-- Remover tabelas existentes para garantir uma instalação limpa
DROP TABLE IF EXISTS `fechamento_diario`;
DROP TABLE IF EXISTS `usuarios`;
DROP TABLE IF EXISTS `tipos_exames`;
DROP TABLE IF EXISTS `despesas_diarias`;
DROP TABLE IF EXISTS `atendimentos`;
DROP TABLE IF EXISTS `agendamentos`;
DROP TABLE IF EXISTS `pacientes`;
DROP TABLE IF EXISTS `profissionais`;
DROP TABLE IF EXISTS `documentos_clinica`;
DROP TABLE IF EXISTS `clinicas`;

-- Tabela para Clínicas
CREATE TABLE `clinicas` (
    `id_clinica` INT AUTO_INCREMENT PRIMARY KEY,
    `nome_clinica` VARCHAR(255) NOT NULL,
    `cnpj` VARCHAR(18) UNIQUE NOT NULL,
    `endereco` VARCHAR(255),
    `cidade` VARCHAR(100),
    `estado` VARCHAR(2),
    `cep` VARCHAR(10),
    `telefone` VARCHAR(20),
    `email` VARCHAR(255),
    `ativo` BOOLEAN DEFAULT TRUE,
    `data_cadastro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Documentos Fiscais das Clínicas
CREATE TABLE `documentos_clinica` (
    `id_documento` INT AUTO_INCREMENT PRIMARY KEY,
    `id_clinica` INT NOT NULL,
    `tipo_documento` VARCHAR(100) NOT NULL,
    `nome_arquivo` VARCHAR(255) NOT NULL,
    `caminho_arquivo` VARCHAR(255) NOT NULL,
    `data_upload` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `data_validade` DATE,
    `tamanho_mb` DECIMAL(5,2),
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Profissionais (Médicos e Psicólogos)
CREATE TABLE `profissionais` (
    `id_profissional` INT AUTO_INCREMENT PRIMARY KEY,
    `id_clinica` INT, -- Pode ser NULL se o profissional não estiver vinculado a uma clínica específica inicialmente
    `nome_completo` VARCHAR(255) NOT NULL,
    `cpf` VARCHAR(14) UNIQUE NOT NULL,
    `registro_conselho` VARCHAR(50) UNIQUE NOT NULL,
    `tipo_registro` ENUM("Medico", "Psicologo") NOT NULL,
    `salario` DECIMAL(10,2),
    `data_contratacao` DATE NOT NULL,
    `nome_arquivo_documento` VARCHAR(255),
    `caminho_arquivo_documento` VARCHAR(255),
    `tamanho_mb_documento` DECIMAL(5,2),
    `ativo` BOOLEAN DEFAULT TRUE,
    `data_cadastro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Pacientes
CREATE TABLE `pacientes` (
    `id_paciente` INT AUTO_INCREMENT PRIMARY KEY,
    `nome_paciente` VARCHAR(255) NOT NULL,
    `cpf` VARCHAR(14) UNIQUE NOT NULL,
    `renach` VARCHAR(50),
    `telefone_contato` VARCHAR(20),
    `data_cadastro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Agendamentos
CREATE TABLE `agendamentos` (
    `id_agendamento` INT AUTO_INCREMENT PRIMARY KEY,
    `id_clinica` INT NOT NULL,
    `id_paciente` INT NOT NULL,
    `id_profissional` INT, -- Pode ser NULL se o agendamento ainda não tiver um profissional atribuído
    `data_hora_consulta` DATETIME NOT NULL,
    `tipo_exame_agendado` VARCHAR(100) NOT NULL,
    `status_atendimento` ENUM("Agendado", "Presente", "Faltou", "Cancelado") DEFAULT "Agendado",
    `observacao_agendamento` TEXT,
    `data_registro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE CASCADE,
    FOREIGN KEY (`id_paciente`) REFERENCES `pacientes`(`id_paciente`) ON DELETE CASCADE,
    FOREIGN KEY (`id_profissional`) REFERENCES `profissionais`(`id_profissional`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Registros de Atendimento (após o agendamento ser marcado como \'Presente\')
CREATE TABLE `atendimentos` (
    `id_atendimento` INT AUTO_INCREMENT PRIMARY KEY,
    `id_agendamento` INT NOT NULL,
    `id_clinica` INT NOT NULL,
    `id_paciente` INT NOT NULL,
    `id_profissional` INT NOT NULL,
    `data_atendimento` DATETIME NOT NULL,
    `tipo_exame_realizado` VARCHAR(100) NOT NULL,
    `valor_pago` DECIMAL(10,2) NOT NULL,
    `forma_pagamento` VARCHAR(50) NOT NULL,
    `observacao_atendimento` TEXT,
    `data_registro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_agendamento`) REFERENCES `agendamentos`(`id_agendamento`) ON DELETE CASCADE,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE CASCADE,
    FOREIGN KEY (`id_paciente`) REFERENCES `pacientes`(`id_paciente`) ON DELETE CASCADE,
    FOREIGN KEY (`id_profissional`) REFERENCES `profissionais`(`id_profissional`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Despesas Diárias
CREATE TABLE `despesas_diarias` (
    `id_despesa` INT AUTO_INCREMENT PRIMARY KEY,
    `id_clinica` INT NOT NULL,
    `data_despesa` DATE NOT NULL,
    `descricao` VARCHAR(255) NOT NULL,
    `valor` DECIMAL(10,2) NOT NULL,
    `data_registro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Tipos de Exames (Tabela de Valores)
CREATE TABLE `tipos_exames` (
    `id_tipo_exame` INT AUTO_INCREMENT PRIMARY KEY,
    `nome_exame` VARCHAR(100) UNIQUE NOT NULL,
    `valor_padrao` DECIMAL(10,2) NOT NULL,
    `tipo_atendimento` ENUM("Medico", "Psicologo", "Duplo") NOT NULL,
    `ativo` BOOLEAN DEFAULT TRUE,
    `data_cadastro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Usuários do Sistema
CREATE TABLE `usuarios` (
    `id_usuario` INT AUTO_INCREMENT PRIMARY KEY,
    `nome_usuario` VARCHAR(255) NOT NULL,
    `email` VARCHAR(255) UNIQUE NOT NULL,
    `senha` VARCHAR(255) NOT NULL,
    `perfil_acesso` ENUM("Secretaria", "Gerente", "Administrador") NOT NULL,
    `id_clinica` INT, -- NULL para Administrador, que pode ver todas as clínicas
    `ativo` BOOLEAN DEFAULT TRUE,
    `data_cadastro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para Fechamento Diário (Resumo Financeiro)
CREATE TABLE `fechamento_diario` (
    `id_fechamento` INT AUTO_INCREMENT PRIMARY KEY,
    `id_clinica` INT NOT NULL,
    `data_fechamento` DATE UNIQUE NOT NULL,
    `total_recebido` DECIMAL(10,2) DEFAULT 0.00,
    `total_despesas` DECIMAL(10,2) DEFAULT 0.00,
    `saldo_dia` DECIMAL(10,2) DEFAULT 0.00,
    `detalhes_pagamento` JSON, -- Para armazenar total por forma de pagamento
    `detalhes_exame` JSON, -- Para armazenar total por tipo de exame
    `detalhes_profissionais` JSON, -- Para armazenar pagamento por profissional
    `data_registro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (`id_clinica`) REFERENCES `clinicas`(`id_clinica`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Reabilitar verificações de chave estrangeira
SET FOREIGN_KEY_CHECKS = 1;
