--
-- Host: localhost    Database: whatsapp_atendimento
-- ------------------------------------------------------


--
-- Table structure for table `apis_radiusnet`
--

CREATE TABLE `apis_radiusnet` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `endpoint` varchar(255) NOT NULL COMMENT 'Caminho relativo (ex: /cp/{cpf}/2)',
  `metodo` enum('GET','POST','PUT','DELETE') DEFAULT 'GET',
  `parametros` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Schema dos parâmetros no formato JSON Schema' CHECK (json_valid(`parametros`)),
  `descricao` text DEFAULT NULL,
  `headers` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Headers adicionais (ex: {"X-Extra": "valor"})' CHECK (json_valid(`headers`)),
  `tipo_resposta` enum('rows','raw','json') DEFAULT 'rows',
  `categoria` varchar(50) DEFAULT NULL COMMENT 'cliente, cobranca, suporte, etc',
  `status` enum('ativo','inativo','deprecated') DEFAULT 'ativo',
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `nome` (`nome`),
  KEY `idx_nome` (`nome`),
  KEY `idx_categoria` (`categoria`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `atendimentos`
--

CREATE TABLE `atendimentos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `protocolo` varchar(50) NOT NULL,
  `cliente_numero` varchar(20) NOT NULL,
  `cliente_nome` varchar(200) DEFAULT NULL,
  `setor_id` int(11) DEFAULT NULL,
  `atendente_id` int(11) DEFAULT NULL,
  `status` enum('robot','fila','em_atendimento','encerrado','transferido') DEFAULT 'robot',
  `fluxo_atual` varchar(50) DEFAULT NULL,
  `contexto` longtext DEFAULT NULL,
  `contexto_robot` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`contexto_robot`)),
  `historico` longtext DEFAULT NULL,
  `protocolo_radius` varchar(50) DEFAULT NULL,
  `avaliacao` tinyint(4) DEFAULT NULL COMMENT '1-5 estrelas',
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `encerrado_em` timestamp NULL DEFAULT NULL,
  `tempo_atendimento` int(11) DEFAULT NULL COMMENT 'tempo em segundos',
  PRIMARY KEY (`id`),
  UNIQUE KEY `protocolo` (`protocolo`),
  KEY `idx_cliente` (`cliente_numero`),
  KEY `idx_status` (`status`),
  KEY `idx_setor` (`setor_id`),
  KEY `idx_atendente` (`atendente_id`),
  KEY `idx_protocolo` (`protocolo`),
  KEY `idx_created` (`created_at`),
  CONSTRAINT `atendimentos_ibfk_1` FOREIGN KEY (`setor_id`) REFERENCES `setores` (`id`) ON DELETE SET NULL,
  CONSTRAINT `atendimentos_ibfk_2` FOREIGN KEY (`atendente_id`) REFERENCES `atendentes` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=155 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`whatsapp_user`@`localhost`*/ /*!50003 TRIGGER trg_atendimento_encerrado 
BEFORE UPDATE ON atendimentos
FOR EACH ROW
BEGIN
    IF NEW.status = 'encerrado' AND OLD.status != 'encerrado' THEN
        SET NEW.tempo_atendimento = UNIX_TIMESTAMP(NEW.encerrado_em) - UNIX_TIMESTAMP(NEW.created_at);
        SET NEW.encerrado_em = NOW();
    END IF;
END */;;
DELIMITER ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`whatsapp_user`@`localhost`*/ /*!50003 TRIGGER trg_log_atendimento_update
AFTER UPDATE ON atendimentos
FOR EACH ROW
BEGIN
    IF OLD.status != NEW.status THEN
        INSERT INTO logs_atendimento (atendimento_id, atendente_id, acao, descricao)
        VALUES (NEW.id, NEW.atendente_id, 'status_changed', 
                CONCAT('Status alterado de ', OLD.status, ' para ', NEW.status));
    END IF;
END */;;
DELIMITER ;

--
-- Table structure for table `avaliacoes`
--

CREATE TABLE `avaliacoes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `atendimento_id` int(11) NOT NULL,
  `atendente_id` int(11) DEFAULT NULL,
  `nota` tinyint(4) NOT NULL CHECK (`nota` between 1 and 5),
  `comentario` text DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_atendimento` (`atendimento_id`),
  KEY `idx_atendente` (`atendente_id`),
  CONSTRAINT `avaliacoes_ibfk_1` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimentos` (`id`) ON DELETE CASCADE,
  CONSTRAINT `avaliacoes_ibfk_2` FOREIGN KEY (`atendente_id`) REFERENCES `atendentes` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `blocos_codigo`
--

CREATE TABLE `blocos_codigo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ordem` int(11) NOT NULL DEFAULT 0,
  `tipo` enum('ferramenta','etapa','fluxo','regra','biblioteca','util','nucleo') DEFAULT 'etapa',
  `nome` varchar(100) NOT NULL,
  `conteudo` longtext NOT NULL,
  `descricao` text DEFAULT NULL,
  `gatilhos` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Palavras-chave que ativam este bloco' CHECK (json_valid(`gatilhos`)),
  `status` enum('ativo','inativo','teste') DEFAULT 'ativo',
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_ordem` (`ordem`),
  KEY `idx_tipo` (`tipo`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `configuracoes_robot`
--

CREATE TABLE `configuracoes_robot` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `chave` varchar(100) NOT NULL,
  `valor` text NOT NULL,
  `descricao` varchar(255) DEFAULT NULL,
  `tipo` enum('texto','numero','booleano') DEFAULT 'texto',
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `chave` (`chave`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `fila_atendimento`
--

CREATE TABLE `fila_atendimento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `atendimento_id` int(11) NOT NULL,
  `setor_id` int(11) NOT NULL,
  `prioridade` int(11) DEFAULT 0,
  `status` enum('aguardando','atendendo','cancelado') DEFAULT 'aguardando',
  `criado_em` timestamp NOT NULL DEFAULT current_timestamp(),
  `atendido_em` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_setor_status` (`setor_id`,`status`),
  KEY `idx_atendimento` (`atendimento_id`),
  CONSTRAINT `fila_atendimento_ibfk_1` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimentos` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fila_atendimento_ibfk_2` FOREIGN KEY (`setor_id`) REFERENCES `setores` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `fila_robot`
--

CREATE TABLE `fila_robot` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `atendimento_id` int(11) NOT NULL,
  `acao` enum('processar_mensagem','retry') DEFAULT 'processar_mensagem',
  `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`payload`)),
  `status` enum('pendente','processando','concluido','erro') DEFAULT 'pendente',
  `tentativas` int(11) DEFAULT 0,
  `criado_em` timestamp NOT NULL DEFAULT current_timestamp(),
  `processado_em` timestamp NULL DEFAULT NULL,
  `erro_msg` text DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`),
  KEY `atendimento_id` (`atendimento_id`),
  CONSTRAINT `fila_robot_ibfk_1` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimentos` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1037 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `fluxos`
--

CREATE TABLE `fluxos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `descricao` text DEFAULT NULL,
  `palavras_chave` text DEFAULT NULL,
  `setor_destino_id` int(11) DEFAULT NULL,
  `config` text DEFAULT NULL,
  `status` enum('ativo','inativo') DEFAULT 'ativo',
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `nome` (`nome`),
  KEY `setor_destino_id` (`setor_destino_id`),
  KEY `idx_nome` (`nome`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fluxos_ibfk_1` FOREIGN KEY (`setor_destino_id`) REFERENCES `setores` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `logs_atendimento`
--

CREATE TABLE `logs_atendimento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `atendimento_id` int(11) DEFAULT NULL,
  `atendente_id` int(11) DEFAULT NULL,
  `acao` varchar(100) NOT NULL,
  `descricao` text DEFAULT NULL,
  `ip` varchar(45) DEFAULT NULL,
  `user_agent` varchar(255) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_atendimento` (`atendimento_id`),
  KEY `idx_atendente` (`atendente_id`),
  KEY `idx_acao` (`acao`),
  KEY `idx_created` (`created_at`),
  CONSTRAINT `logs_atendimento_ibfk_1` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimentos` (`id`) ON DELETE SET NULL,
  CONSTRAINT `logs_atendimento_ibfk_2` FOREIGN KEY (`atendente_id`) REFERENCES `atendentes` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=170 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `mensagens_atendimento`
--

CREATE TABLE `mensagens_atendimento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `atendimento_id` int(11) NOT NULL,
  `origem` enum('cliente','robot','atendente','sistema') NOT NULL,
  `tipo` enum('texto','template','midia','sistema','audio','imagem','video','documento') DEFAULT 'texto',
  `conteudo` text NOT NULL,
  `template_name` varchar(100) DEFAULT NULL,
  `parametros` text DEFAULT NULL,
  `metadata` text DEFAULT NULL,
  `media_url` varchar(500) DEFAULT NULL,
  `processada` tinyint(4) DEFAULT 0,
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_atendimento` (`atendimento_id`),
  KEY `idx_origem` (`origem`),
  KEY `idx_processada` (`processada`),
  KEY `idx_created` (`created_at`),
  CONSTRAINT `mensagens_atendimento_ibfk_1` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimentos` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2120 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Table structure for table `setores`
--

CREATE TABLE `setores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(100) NOT NULL,
  `descricao` text DEFAULT NULL,
  `status` enum('ativo','inativo') DEFAULT 'ativo',
  `created_at` timestamp NOT NULL DEFAULT current_timestamp(),
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Temporary table structure for view `vw_dashboard_atendimentos`
--

/*!50001 DROP VIEW IF EXISTS `vw_dashboard_atendimentos`*/;
/*!50001 CREATE VIEW `vw_dashboard_atendimentos` AS SELECT
 1 AS `data`,
  1 AS `total`,
  1 AS `concluidos`,
  1 AS `na_fila`,
  1 AS `em_atendimento`,
  1 AS `robot`,
  1 AS `tempo_medio` */;

--
-- Temporary table structure for view `vw_fila_setores`
--

/*!50001 DROP VIEW IF EXISTS `vw_fila_setores`*/;
/*!50001 CREATE VIEW `vw_fila_setores` AS SELECT
 1 AS `setor_id`,
  1 AS `setor_nome`,
  1 AS `qtd_fila`,
  1 AS `mais_antigo` */;

--
-- Temporary table structure for view `vw_performance_atendentes`
--

/*!50001 DROP VIEW IF EXISTS `vw_performance_atendentes`*/;
/*!50001 CREATE VIEW `vw_performance_atendentes` AS SELECT
 1 AS `atendente_id`,
  1 AS `atendente_nome`,
  1 AS `setor_nome`,
  1 AS `total_atendimentos`,
  1 AS `tempo_medio`,
  1 AS `concluidos`,
  1 AS `ultimo_atendimento` */;

--
-- Dumping routines for database 'whatsapp_atendimento'
--
/*!50003 DROP FUNCTION IF EXISTS `gerar_protocolo` */;
DELIMITER ;;
CREATE DEFINER=`whatsapp_user`@`localhost` FUNCTION `gerar_protocolo`() RETURNS varchar(50) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
    DETERMINISTIC
BEGIN
    DECLARE novo_protocolo VARCHAR(50);
    DECLARE existe INT;
    
    REPEAT
        SET novo_protocolo = CONCAT(
            'PROT-', 
            DATE_FORMAT(NOW(), '%Y%m'),
            '-',
            LPAD(FLOOR(RAND() * 99999), 5, '0')
        );
        
        SELECT COUNT(*) INTO existe 
        FROM atendimentos 
        WHERE protocolo = novo_protocolo;
    UNTIL existe = 0 END REPEAT;
    
    RETURN novo_protocolo;
END ;;
DELIMITER ;

--
-- Final view structure for view `vw_dashboard_atendimentos`
--

/*!50001 DROP VIEW IF EXISTS `vw_dashboard_atendimentos`*/;

--
-- Final view structure for view `vw_fila_setores`
--

/*!50001 DROP VIEW IF EXISTS `vw_fila_setores`*/;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`whatsapp_user`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `vw_fila_setores` AS select `s`.`id` AS `setor_id`,`s`.`nome` AS `setor_nome`,count(`fa`.`id`) AS `qtd_fila`,min(`fa`.`criado_em`) AS `mais_antigo` from (`setores` `s` left join `fila_atendimento` `fa` on(`s`.`id` = `fa`.`setor_id` and `fa`.`status` = 'aguardando')) where `s`.`status` = 'ativo' group by `s`.`id`,`s`.`nome` */;

--
-- Final view structure for view `vw_performance_atendentes`
--

/*!50001 DROP VIEW IF EXISTS `vw_performance_atendentes`*/;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`whatsapp_user`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `vw_performance_atendentes` AS select `a`.`id` AS `atendente_id`,`a`.`nome` AS `atendente_nome`,`s`.`nome` AS `setor_nome`,count(`at`.`id`) AS `total_atendimentos`,avg(`at`.`tempo_atendimento`) AS `tempo_medio`,sum(case when `at`.`status` = 'encerrado' then 1 else 0 end) AS `concluidos`,max(`at`.`updated_at`) AS `ultimo_atendimento` from ((`atendentes` `a` left join `setores` `s` on(`a`.`setor_id` = `s`.`id`)) left join `atendimentos` `at` on(`a`.`id` = `at`.`atendente_id` and `at`.`created_at` >= current_timestamp() - interval 30 day)) where `a`.`status` = 'ativo' group by `a`.`id`,`a`.`nome`,`s`.`nome` */;


