DROP TABLE IF EXISTS mod_appointments;
DROP TABLE IF EXISTS mod_appointments_services;
DROP TABLE IF EXISTS mod_appointments_reviews;
DROP TABLE IF EXISTS mod_appointments_schedules;
DROP TABLE IF EXISTS mod_appointments_payments;
DROP TABLE IF EXISTS mod_providers;
DROP TABLE IF EXISTS mod_services;
DROP TABLE IF EXISTS mod_appointments_exceptions;
DROP TABLE IF EXISTS mod_appointment_logs;
DROP TABLE IF EXISTS mod_invoices;
DROP TABLE IF EXISTS notifications;
DROP TABLE IF EXISTS mod_persons;
DROP TABLE IF EXISTS mod_persons_types;


CREATE TABLE `mod_appointments` (
  `mod_apt_id` INT NOT NULL AUTO_INCREMENT COMMENT 'Id único de la cita',
  `mod_apt_cpe_id` INT NOT NULL COMMENT 'Id customer persona (cliente)',
  `mod_apt_person_id` INT NOT NULL COMMENT 'Id de la persona asociada a la cita',
  `mod_apt_acu_id` INT NOT NULL COMMENT 'Id persona que se registra',
  `mod_apt_provider_id` INT NOT NULL COMMENT 'Id proveedor (cuenta relacionada con el servicio)',
  `mod_apt_srv_id` INT NOT NULL COMMENT 'Id del servicio relacionado',
  `mod_apt_sch_id` INT NOT NULL COMMENT 'Id del horario asociado',
  `mod_apt_date` DATE NOT NULL COMMENT 'Fecha de la cita',
  `mod_apt_time` TIME DEFAULT NULL COMMENT 'Hora de la cita (NULL si es todo el día)',
  `mod_apt_all_day` TINYINT(1) DEFAULT 0 COMMENT 'Indica si la cita es todo el día (0: No, 1: Sí)',
  `mod_apt_place` VARCHAR(255) DEFAULT NULL COMMENT 'Lugar donde se llevará a cabo la cita',
  `mod_apt_guests` TEXT DEFAULT NULL COMMENT 'Lista de invitados (almacenados como JSON)',
  `mod_apt_status` VARCHAR(20) DEFAULT 'pending' COMMENT 'Estado de la cita (pending, confirmed, completed, cancelled)',
  `mod_apt_type` VARCHAR(50) DEFAULT NULL COMMENT 'Tipo de cita (ejemplo: consulta, revisión, seguimiento)',
  `mod_apt_flags` VARCHAR(50) DEFAULT NULL COMMENT 'Banderas o indicadores especiales asociados a la cita',
  `mod_apt_comments` TEXT DEFAULT NULL COMMENT 'Comentarios o descripción adicional del evento',
  `mod_apt_created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación de la cita',
  `mod_apt_updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Última actualización de la cita',
  `mod_apt_state` INT DEFAULT '0' COMMENT 'Estado lógico de la cita (0: inactivo, 1: activo)',
  PRIMARY KEY (`mod_apt_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


/* CREATE TABLE `mod_appointments_services` (
  `mod_apt_srv_id` int NOT NULL,
  `mod_apt_srv_provider_id` int DEFAULT NULL,
  `mod_apt_srv_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `mod_apt_srv_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
  `mod_apt_srv_duration` int DEFAULT NULL COMMENT 'min',
  `mod_apt_srv_price` decimal(10,2) DEFAULT NULL,
  `mod_apt_srv_ent_id` int DEFAULT NULL,
  `mod_apt_srv_state` int DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


ALTER TABLE `mod_appointments_services`
  ADD PRIMARY KEY (`mod_apt_srv_id`);

ALTER TABLE `mod_appointments_services`
  MODIFY `mod_apt_srv_id` int NOT NULL AUTO_INCREMENT;
COMMIT; */

CREATE TABLE `mod_appointments_reviews` (
  `mod_apt_rev_id` int NOT NULL AUTO_INCREMENT COMMENT 'Id único de la reseña',
  `mod_apt_rev_apt_id` int NOT NULL COMMENT 'Id de la cita asociada',
  `mod_apt_rev_client_id` int NOT NULL COMMENT 'Id del cliente que realiza la reseña',
  `mod_apt_rev_provider_id` int NOT NULL COMMENT 'Id del proveedor asociado a la reseña',
  `mod_apt_rev_rating` int DEFAULT NULL COMMENT 'Calificación dada por el cliente (1-5)',
  `mod_apt_rev_comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT 'Comentario opcional del cliente',
  `mod_apt_rev_register_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de registro de la reseña',
  `mod_apt_rev_state` int DEFAULT '0' COMMENT 'Estado de la reseña (activo/inactivo)',
  PRIMARY KEY (`mod_apt_rev_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Tabla de reseñas y valoraciones de los servicios por parte de los clientes';


CREATE TABLE `mod_appointments_schedules` (
  `mod_apt_sch_id` int NOT NULL AUTO_INCREMENT,
  `mod_apt_sch_provider_id` int NOT NULL COMMENT 'Id del proveedor',
  `mod_apt_sch_day` enum('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Día de la semana',
  `mod_apt_sch_hour_start` time NOT NULL COMMENT 'Hora de inicio',
  `mod_apt_sch_hour_end` time NOT NULL COMMENT 'Hora de finalización',
  `mod_apt_sch_state` int DEFAULT '0' COMMENT 'Estado (0: Inactivo, 1: Activo)',
  `mod_apt_sch_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
  `mod_apt_sch_updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Última actualización',
  PRIMARY KEY (`mod_apt_sch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Disponibilidad de proveedores por día y hora';


CREATE TABLE `mod_appointments_exceptions` (
  `mod_apt_exc_id` int NOT NULL AUTO_INCREMENT,
  `mod_apt_exc_provider_id` int NOT NULL COMMENT 'Id del proveedor',
  `mod_apt_exc_date` date NOT NULL COMMENT 'Fecha de la excepción',
  `mod_apt_exc_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'Razón de la excepción',
  `mod_apt_exc_created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
  `mod_apt_exc_updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Última actualización',
  PRIMARY KEY (`mod_apt_exc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Excepciones en la disponibilidad de los proveedores (vacaciones, días festivos, etc.)';

CREATE TABLE `mod_appointments_logs` (
  `mod_apt_log_id` int NOT NULL AUTO_INCREMENT,
  `mod_apt_log_apt_id` int NOT NULL COMMENT 'Id de la cita',
  `mod_apt_log_action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Acción realizada (crear, modificar, cancelar, etc.)',
  `mod_apt_log_changed_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora del cambio',
  `mod_apt_log_changed_by` int NOT NULL COMMENT 'Id del usuario o administrador que realizó el cambio',
  PRIMARY KEY (`mod_apt_log_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Historial de cambios realizados en las citas';


CREATE TABLE `mod_appointments_payments` (
  `mod_apt_pay_id` int NOT NULL AUTO_INCREMENT COMMENT 'Id del pago',
  `mod_apt_pay_apt_id` int NOT NULL,
  `mod_apt_pay_amount` decimal(10,2) NOT NULL,
  `mod_apt_pay_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `mod_apt_pay_method` varchar(255) NOT NULL COMMENT 'Método de pago credit_card,paypal,stripe,efectivo,qr..',
  `mod_apt_pay_status` varchar(255) DEFAULT 'pending,failed,completed',
  `mod_apt_pay_state` int DEFAULT '0',
  PRIMARY KEY (`mod_apt_pay_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;


CREATE TABLE `mod_providers` (
  `mod_prov_id` int NOT NULL AUTO_INCREMENT,
  `mod_prov_code` varchar(255) NOT NULL,
  `mod_prov_user_id` int NOT NULL,
  `mod_prov_name` varchar(255) NOT NULL,
  `mod_prov_email` varchar(255) NOT NULL,
  `mod_prov_phone` varchar(255) NOT NULL,
  `mod_prov_address` varchar(255) NOT NULL,
  `mod_prov_rating` DECIMAL(3,2) DEFAULT NULL,
  `mod_prov_city` varchar(255) NOT NULL,
  `mod_prov_zip` varchar(255) NOT NULL,
  `mod_prov_country` varchar(255) NOT NULL,
  `mod_prov_website` varchar(255) NOT NULL,
  `mod_prov_logo` varchar(255) NOT NULL,
  `mod_prov_description` varchar(255) NOT NULL,
  `mod_prov_type` varchar(255) NOT NULL,
  `mod_prov_created` datetime NOT NULL,
  `mod_prov_modified` datetime NOT NULL,
  `mod_prov_deleted` datetime DEFAULT NULL COMMENT 'Fecha de eliminación (si aplica)',
  `mod_prov_state` int DEFAULT '0' COMMENT 'Estado (0: Inactivo, 1: Activo)',
  PRIMARY KEY (`mod_prov_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Tabla de proveedores';


 
CREATE TABLE `mod_services` (
  `mod_srv_id` int NOT NULL AUTO_INCREMENT,
  `mod_srv_name` varchar(255) NOT NULL,
  `mod_srv_description` varchar(255) NOT NULL,
  `mod_srv_active` int NOT NULL,
  `mod_srv_duration` varchar(255) NOT NULL,
  `mod_srv_type` varchar(255) NOT NULL,
  `mod_srv_price` DECIMAL(10,2) NOT NULL,
  `mod_srv_created` datetime NOT NULL,
  `mod_srv_modified` datetime NOT NULL,
  `mod_srv_deleted` datetime DEFAULT NULL,
  `mod_srv_state` int DEFAULT '0',
  PRIMARY KEY (`mod_srv_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Tabla de servicios';


CREATE TABLE `notifications` (
  `ntf_id` int NOT NULL AUTO_INCREMENT,
  `ntf_recipient_id` int NOT NULL COMMENT 'Id del destinatario',
  `ntf_recipient_type` varchar(255) NOT NULL COMMENT 'Tipo de destinatario (customer,provider)',
  `ntf_message` text NOT NULL,
  `ntf_sent_at` timestamp DEFAULT CURRENT_TIMESTAMP,
  `ntf_status` varchar(255) DEFAULT 'pending,send,delivered',
  `ntf_ent_id` int NOT NULL,
  `ntf_custom_data` json DEFAULT NULL,
  `ntf_class` varchar(255) DEFAULT NULL,
  `ntf_custom_id` varchar(255) DEFAULT NULL,
  `ntf_state` int DEFAULT '0',
  PRIMARY KEY (`ntf_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE `mod_invoices` (
  `mod_inv_id` int NOT NULL AUTO_INCREMENT,
  `mod_inv_px_id` int NOT NULL COMMENT 'Id del pago relacionado',
  `mod_inv_date` timestamp DEFAULT CURRENT_TIMESTAMP,
  `mod_inv_total` decimal(10,2) NOT NULL,
  `mod_inv_status` varchar(255) NOT NULL DEFAULT 'pending',
  `mod_inv_register_date` timestamp DEFAULT CURRENT_TIMESTAMP,
  `mod_inv_user_id` int NOT NULL,
  `mod_inv_ent_id` int NOT NULL,
  `mod_inv_custom_data` json DEFAULT NULL,
  `mod_inv_class` varchar(255) DEFAULT NULL,
  `mod_inv_custom_id` varchar(255) DEFAULT NULL,
  `mod_inv_state` int DEFAULT '0',
  PRIMARY KEY (`mod_inv_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `mod_persons` (
  `mod_person_id` INT NOT NULL AUTO_INCREMENT COMMENT 'Id único de la persona',
  `mod_person_name` VARCHAR(255) NOT NULL COMMENT 'Nombre de la persona',
  `mod_person_lastname_father` VARCHAR(255) NOT NULL COMMENT 'Apellido paterno de la persona',
  `mod_person_lastname_mother` VARCHAR(255) DEFAULT NULL COMMENT 'Apellido materno de la persona',
  `mod_person_email` VARCHAR(255) DEFAULT NULL COMMENT 'Correo electrónico de la persona',
  `mod_person_phone` VARCHAR(20) DEFAULT NULL COMMENT 'Teléfono de contacto',
  `mod_person_ent_id` INT NOT NULL COMMENT 'Id de la entidad asociada',
  `mod_person_type_id` INT NOT NULL COMMENT 'Id del tipo de persona',
  `mod_person_state` INT DEFAULT 0 COMMENT 'Estado lógico de la persona (0: inactivo, 1: activo)',
  `mod_person_comments` TEXT DEFAULT NULL COMMENT 'Campo para comentarios adicionales sobre la persona',
  `mod_person_metadata` JSON DEFAULT NULL COMMENT 'Campo para datos adicionales en formato JSON',
  `mod_person_custom_class` VARCHAR(255) DEFAULT NULL COMMENT 'Clase CSS personalizada asociada a la persona',
  `mod_person_custom_id` VARCHAR(255) DEFAULT NULL COMMENT 'ID personalizado asociado a la persona',
  `mod_person_created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
  `mod_person_updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Última actualización',
  PRIMARY KEY (`mod_person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE `mod_persons_types` (
  `mod_person_type_id` INT NOT NULL AUTO_INCREMENT COMMENT 'Id único del tipo de persona',
  `mod_person_type_code` VARCHAR(50) NOT NULL COMMENT 'Código único para identificar el tipo',
  `mod_person_type_name` VARCHAR(100) NOT NULL COMMENT 'Nombre descriptivo del tipo',
  `mod_person_type_description` TEXT DEFAULT NULL COMMENT 'Descripción detallada del tipo',
  `mod_person_type_metadata` JSON DEFAULT NULL COMMENT 'Datos adicionales en formato JSON',
  `mod_person_type_state` INT DEFAULT 1 COMMENT 'Estado lógico del tipo (0: inactivo, 1: activo)',
  PRIMARY KEY (`mod_person_type_id`),
  UNIQUE KEY `mod_person_type_code_UNIQUE` (`mod_person_type_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- Insertar tipos base
INSERT INTO `mod_persons_types` (
  `mod_person_type_code`, 
  `mod_person_type_name`, 
  `mod_person_type_description`
) VALUES
('LEAD', 'Lead', 'Posible cliente potencial'),
('CUSTOMER', 'Cliente', 'Cliente activo'),
('PROVIDER', 'Proveedor', 'Proveedor de servicios o productos');

