-- Solo estructura, sin datos, y con longitud en índices sobre TEXT/BLOB

DROP TABLE IF EXISTS `codes`;
CREATE TABLE `codes` (
  `UUID` varchar(255) NOT NULL,
  `CODE` varchar(255) NOT NULL,
  PRIMARY KEY (`UUID`,`CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `globals`;
CREATE TABLE `globals` (
  `var` tinytext NOT NULL,
  `val` text NOT NULL,
  `timestamp` int(11) NOT NULL DEFAULT 0,
  UNIQUE KEY `var` (`var`(100)) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `UUID` text NOT NULL,
  `P_DATE` text NOT NULL,
  `P_ORDER` tinytext NOT NULL,
  `P_RESPONSE` tinytext NOT NULL,
  `P_AMOUNT` int(11) NOT NULL DEFAULT 0,
  `P_DEBIT` int(11) DEFAULT 0,
  `P_DATA` text NOT NULL,
  `P_URL` text NOT NULL,
  `USED` int(11) DEFAULT 0,
  `U_DATE` text DEFAULT NULL,
  `R_DATA` text DEFAULT NULL,
  `R_DATE` text DEFAULT NULL,
  `HUB` text NOT NULL,
  `WHO` text NOT NULL,
  `WHERE` text NOT NULL,
  `THING` text NOT NULL,
  `NAME` text NOT NULL,
  `DEVICE` text NOT NULL,
  `G_CURRENCY` text DEFAULT NULL,
  `G_POINTS` text DEFAULT NULL,
  `G_AMOUNT` text DEFAULT NULL,
  `SUBSCRIPT_ID` text, -- <--- Elimina DEFAULT ''
  `SUBSCRIPTION` tinyint(1) NOT NULL DEFAULT 0,
  `SUBSCRI_WASH` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `rewards`;
CREATE TABLE `rewards` (
  `UUID` text NOT NULL,
  `CURRENCY` text NOT NULL,
  `TOTAL` float NOT NULL DEFAULT 0,
  UNIQUE KEY `INDEX` (`UUID`(100),`CURRENCY`(100)) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `subscriptions`;
CREATE TABLE `subscriptions` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Identificador único de la suscripción',
  `uuid` varchar(64) NOT NULL COMMENT 'Identificador del usuario (UUID)',
  `item_id` int(11) NOT NULL COMMENT 'ID del producto/servicio (campo id en items)',
  `item_title` varchar(128) NOT NULL COMMENT 'Nombre del producto/servicio (campo title en items)',
  `subscription_id` varchar(64) DEFAULT NULL,
  `subscription_name` varchar(64) NOT NULL COMMENT 'Nombre de la suscripción (campo subscription.name)',
  `subscription_text` varchar(255) NOT NULL COMMENT 'Descripción de la suscripción (campo subscription.text)',
  `subscription_price` int(11) NOT NULL COMMENT 'Precio de la suscripción en céntimos (campo subscription.price)',
  `license_plate` varchar(20) DEFAULT NULL COMMENT 'Matrícula del vehículo asociada a la suscripción',
  `start_date` datetime NOT NULL COMMENT 'Fecha de inicio de la suscripción',
  `end_date` datetime DEFAULT NULL COMMENT 'Fecha de fin de la suscripción (si aplica)',
  `status` varchar(20) NOT NULL DEFAULT 'active' COMMENT 'Estado de la suscripción: active, cancelled, expired, etc.',
  `last_charge` datetime DEFAULT NULL,
  `HUB` text DEFAULT NULL,
  `WHO` text DEFAULT NULL,
  `WHERE` text DEFAULT NULL,
  `THING` text DEFAULT NULL,
  `device_key` varchar(64) DEFAULT NULL,
  `failed_attempts` int(11) DEFAULT 0,
  `cancelled_at` datetime DEFAULT NULL COMMENT 'Fecha de cancelación de la suscripción',
  `created_at` datetime DEFAULT current_timestamp() COMMENT 'Fecha de creación del registro',
  `updated_at` datetime DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT 'Fecha de última actualización',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uuid` (`uuid`(64),`item_id`,`license_plate`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Suscripciones activas de los usuarios a productos/servicios y vehículos';

DROP TABLE IF EXISTS `tokenization`;
CREATE TABLE `tokenization` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `UUID` text NOT NULL,
  `WHO` text NOT NULL,
  `WHERE` text NOT NULL,
  `WIU` text NOT NULL COMMENT 'MD5 UUDI .HUB .WHERE',
  `PROVIDER` text NOT NULL,
  `TOKEN` text NOT NULL,
  `COFID` text DEFAULT NULL COMMENT 'Usado junto a TOKEN para cobros recursivos',
  PRIMARY KEY (`ID`) USING BTREE,
  UNIQUE KEY `WIU` (`WIU`(100)) USING HASH
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` text NOT NULL,
  `uuid` text NOT NULL,
  `confirmed` int(11) NOT NULL DEFAULT 0,
  `password` text NOT NULL,
  `WHO` text NOT NULL,
  `WHERE` text NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `email` (`email`(100)) USING HASH
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `uses`;
CREATE TABLE `uses` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `APIKEY` text NOT NULL,
  `NAME` text NOT NULL,
  `DATE` text NOT NULL,
  `SCANED` int(11) NOT NULL DEFAULT 0,
  UNIQUE KEY `ID` (`ID`) USING BTREE,
  UNIQUE KEY `INDEX` (`NAME`(100),`DATE`(20)) USING HASH
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `qr`;
CREATE TABLE `qr` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) NOT NULL,
  `uuid` varchar(255) DEFAULT NULL,
  `customer_email` varchar(255) DEFAULT NULL COMMENT 'Email del cliente',
  `location` varchar(255) DEFAULT NULL COMMENT 'Ubicación donde se adquirió/generó el QR',
  `device_name` varchar(255) NOT NULL COMMENT 'Nombre del dispositivo',
  `device_token` varchar(255) NOT NULL COMMENT 'Token del dispositivo',
  `payment_method` varchar(50) NOT NULL DEFAULT 'cash' COMMENT 'Método de pago',
  `total_net` int(11) NOT NULL DEFAULT 0 COMMENT 'Total neto sin impuestos en céntimos',
  `total_taxes` int(11) NOT NULL DEFAULT 0 COMMENT 'Total de impuestos en céntimos',
  `total_amount` int(11) NOT NULL DEFAULT 0 COMMENT 'Total final en céntimos',
  `print_option` tinyint(1) DEFAULT 0 COMMENT 'Opción de imprimir',
  `email_option` tinyint(1) DEFAULT 0 COMMENT 'Opción de enviar email',
  `status` varchar(20) DEFAULT 'pending' COMMENT 'Estado del QR',
  `valid_from` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'Fecha desde cuando es válido el QR',
  `valid_until` datetime DEFAULT NULL COMMENT 'Fecha hasta cuando es válido el QR (NULL = sin expiración)',
  `used_at` datetime DEFAULT NULL COMMENT 'Fecha cuando se usó el QR',
  `created_at` datetime DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  KEY `device_name` (`device_name`),
  KEY `location` (`location`),
  KEY `status` (`status`),
  KEY `valid_period` (`valid_from`, `valid_until`),
  KEY `used_at` (`used_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

DROP TABLE IF EXISTS `qr_items`;
CREATE TABLE `qr_items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `qr_id` int(11) NOT NULL,
  `unique_id` varchar(100) NOT NULL COMMENT 'ID único del item',
  `product_name` varchar(255) NOT NULL COMMENT 'Nombre del producto',
  `program_id` int(11) NOT NULL COMMENT 'ID del programa',
  `quantity` int(11) NOT NULL DEFAULT 1 COMMENT 'Cantidad total comprada',
  `quantity_used` int(11) NOT NULL DEFAULT 0 COMMENT 'Cantidad ya utilizada',
  `quantity_refunded` int(11) NOT NULL DEFAULT 0 COMMENT 'Cantidad devuelta',
  `quantity_remaining` int(11) GENERATED ALWAYS AS (`quantity` - `quantity_used` - `quantity_refunded`) STORED COMMENT 'Cantidad disponible (calculada)',
  `unit_price` int(11) NOT NULL COMMENT 'Precio unitario en céntimos',
  `total` int(11) NOT NULL COMMENT 'Total del item en céntimos',
  `has_rewards` tinyint(1) DEFAULT 0 COMMENT 'Tiene recompensas',
  `first_used_at` datetime DEFAULT NULL COMMENT 'Fecha del primer uso',
  `last_used_at` datetime DEFAULT NULL COMMENT 'Fecha del último uso',
  `device_name` varchar(255) NOT NULL COMMENT 'Nombre del dispositivo (duplicado para consistencia)',
  `device_token` varchar(255) NOT NULL COMMENT 'Token del dispositivo (duplicado para consistencia)',
  PRIMARY KEY (`id`),
  KEY `qr_id` (`qr_id`),
  KEY `unique_id` (`unique_id`),
  KEY `program_id` (`program_id`),
  CONSTRAINT `fk_qr_items_qr` FOREIGN KEY (`qr_id`) REFERENCES `qr` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- Tabla para registro detallado de cada uso individual
DROP TABLE IF EXISTS `qr_usage_log`;
CREATE TABLE `qr_usage_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `qr_item_id` int(11) NOT NULL COMMENT 'ID del item usado',
  `qr_id` int(11) NOT NULL COMMENT 'ID del QR (para consultas rápidas)',
  `qr_code` varchar(255) NOT NULL COMMENT 'Código QR usado',
  `quantity_used` int(11) NOT NULL DEFAULT 1 COMMENT 'Cantidad usada en esta ocasión',
  `used_at` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'Fecha y hora del uso',
  `used_by_device` varchar(255) DEFAULT NULL COMMENT 'Dispositivo que registró el uso',
  `location` varchar(255) DEFAULT NULL COMMENT 'Ubicación donde se usó',
  `notes` text DEFAULT NULL COMMENT 'Notas adicionales del uso',
  `user_uuid` varchar(255) DEFAULT NULL COMMENT 'Usuario que lo usó',
  PRIMARY KEY (`id`),
  KEY `qr_item_id` (`qr_item_id`),
  KEY `qr_id` (`qr_id`),
  KEY `qr_code` (`qr_code`),
  KEY `used_at` (`used_at`),
  KEY `user_uuid` (`user_uuid`),
  CONSTRAINT `fk_usage_log_qr_item` FOREIGN KEY (`qr_item_id`) REFERENCES `qr_items` (`id`) ON DELETE CASCADE,
  CONSTRAINT `fk_usage_log_qr` FOREIGN KEY (`qr_id`) REFERENCES `qr` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;