

CREATE TABLE IF NOT EXISTS `acceso_log` (
    `id`            BIGINT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `dispositivo_id` TINYINT UNSIGNED NOT NULL,
    `socio_id`      INT UNSIGNED     NULL,
    `invitado_id`   INT UNSIGNED     NULL,
    `proveedor_id`  INT UNSIGNED     NULL,
    `tipo_persona`  ENUM('socio','invitado','proveedor','empleado','guardia','desconocido') NOT NULL DEFAULT 'desconocido',
    `nombre`        VARCHAR(150)     NULL,
    `rut`           VARCHAR(12)      NULL,
    `patente`       VARCHAR(10)      NULL,
    `metodo`        ENUM('facial','qr','rut_manual','patente_lpr','guardia_manual') NOT NULL,
    `direccion`     ENUM('entrada','salida') NOT NULL DEFAULT 'entrada',
    `autorizado`    TINYINT(1)       NOT NULL DEFAULT 1,
    `motivo_rechazo` VARCHAR(200)    NULL,
    `foto_url`      VARCHAR(500)     NULL,
    `guardia_id`    INT UNSIGNED     NULL,
    `evento_id`     INT UNSIGNED     NULL,
    `timestamp`     TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_socio_acc`    (`socio_id`,`timestamp`),
    KEY `idx_rut_acc`      (`rut`,`timestamp`),
    KEY `idx_patente_acc`  (`patente`,`timestamp`),
    KEY `idx_disp_acc`     (`dispositivo_id`,`timestamp`),
    KEY `idx_ts_acc`       (`timestamp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPRESSED;

CREATE TABLE IF NOT EXISTS `invitados` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `rut`           VARCHAR(12)      NULL,
    `pasaporte`     VARCHAR(20)      NULL,
    `nombre`        VARCHAR(150)     NOT NULL,
    `telefono`      VARCHAR(20)      NULL,
    `email`         VARCHAR(100)     NULL,
    `foto_url`      VARCHAR(500)     NULL,
    `total_visitas_contables` INT UNSIGNED NOT NULL DEFAULT 0,
    `alerta_admin`  TINYINT(1)       NOT NULL DEFAULT 0,
    `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 `uk_rut_inv`       (`rut`),
    UNIQUE KEY `uk_pasaporte_inv` (`pasaporte`),
    KEY `idx_alerta_inv` (`alerta_admin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `invitacion_cuotas` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`      INT UNSIGNED     NOT NULL,
    `invitado_id`   INT UNSIGNED     NOT NULL,
    `anio`          YEAR             NOT NULL,
    `usos`          TINYINT UNSIGNED NOT NULL DEFAULT 0,
    `max_usos`      TINYINT UNSIGNED NOT NULL DEFAULT 5,
    `updated_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_cuota` (`socio_id`,`invitado_id`,`anio`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- TABLA CORREGIDA: columna anio real (no generada) para evitar error de KEY
CREATE TABLE IF NOT EXISTS `invitado_visitas_tracking` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `invitado_id`   INT UNSIGNED     NOT NULL,
    `socio_id`      INT UNSIGNED     NOT NULL,
    `invitacion_id` INT UNSIGNED     NOT NULL,
    `fecha`         DATE             NOT NULL,
    `anio`          YEAR             NOT NULL,
    `tipo`          VARCHAR(50)      NOT NULL,
    `es_evento`     TINYINT(1)       NOT NULL DEFAULT 0,
    `contabiliza`   TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_inv_track`   (`invitado_id`,`anio`),
    KEY `idx_socio_track` (`socio_id`,`fecha`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `acceso_proveedores` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa`       VARCHAR(150)     NOT NULL,
    `rut_empresa`   VARCHAR(12)      NULL,
    `tipo`          ENUM('proveedor','visita_directorio','contratista','servicio','otro') NOT NULL DEFAULT 'proveedor',
    `contacto`      VARCHAR(150)     NULL,
    `telefono`      VARCHAR(20)      NULL,
    `email`         VARCHAR(100)     NULL,
    `activo`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `acceso_visita_personas` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `visita_id`     INT UNSIGNED     NOT NULL,
    `nombre`        VARCHAR(150)     NOT NULL,
    `rut`           VARCHAR(12)      NULL,
    `pasaporte`     VARCHAR(20)      NULL,
    `patente`       VARCHAR(10)      NULL,
    `foto_url`      VARCHAR(500)     NULL,
    `ingreso_at`    TIMESTAMP        NULL,
    `salida_at`     TIMESTAMP        NULL,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_visita_pers` (`visita_id`),
    KEY `idx_rut_vpers`   (`rut`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `acceso_presentes` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`      INT UNSIGNED     NULL,
    `invitado_id`   INT UNSIGNED     NULL,
    `proveedor_id`  INT UNSIGNED     NULL,
    `tipo_persona`  ENUM('socio','invitado','proveedor','empleado','desconocido') NOT NULL,
    `nombre`        VARCHAR(150)     NOT NULL,
    `rut`           VARCHAR(12)      NULL,
    `patente`       VARCHAR(10)      NULL,
    `espacio_id`    INT UNSIGNED     NULL,
    `evento_id`     INT UNSIGNED     NULL,
    `entrada_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `acceso_log_id` BIGINT UNSIGNED  NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_rut_presente` (`rut`),
    KEY `idx_espacio_pres` (`espacio_id`),
    KEY `idx_tipo_pres`    (`tipo_persona`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `socio_fotos_facial` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`      INT UNSIGNED     NOT NULL,
    `foto_url`      VARCHAR(500)     NOT NULL,
    `descriptor`    LONGTEXT         NULL,
    `zkteco_uid`    INT UNSIGNED     NULL,
    `activa`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_socio_foto` (`socio_id`,`activa`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS `estacionamiento_especial` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`      INT UNSIGNED     NOT NULL,
    `tipo`          ENUM('director','administrativo','pagado') NOT NULL,
    `numero_cupo`   VARCHAR(10)      NULL,
    `patentes`      JSON             NULL,
    `desde`         DATE             NOT NULL,
    `hasta`         DATE             NULL,
    `activo`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_socio_estac` (`socio_id`,`activo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabla de patentes por socio (para LPR)
CREATE TABLE IF NOT EXISTS `estacionamiento_patentes` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`      INT UNSIGNED     NOT NULL,
    `patente`       VARCHAR(10)      NOT NULL,
    `descripcion`   VARCHAR(100)     NULL,
    `activo`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_patente` (`patente`),
    KEY `idx_socio_pat` (`socio_id`,`activo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Campo es_director en socios (si no existe)
ALTER TABLE `socios`
    ADD COLUMN IF NOT EXISTS `es_director`            TINYINT(1)       NOT NULL DEFAULT 0,
    ADD COLUMN IF NOT EXISTS `cupos_estacionamiento`  TINYINT UNSIGNED NOT NULL DEFAULT 0;

-- Parametros
INSERT INTO `config_sistema` (`clave`,`valor`,`descripcion`) VALUES
('acceso_max_invitaciones_anio','5','Max invitaciones anuales por persona no-socia'),
('acceso_max_invitaciones_socio','5','Max invitaciones por socio a la misma persona'),
('acceso_alerta_invitado_visitas','5','Alertar admin cuando no-socio supera este numero de visitas'),
('acceso_facial_threshold','0.6','Umbral confianza reconocimiento facial'),
('acceso_lpr_activo','1','LPR activo para lectura automatica de patentes'),
('zkteco_ip_1','192.168.1.101','IP torniquete 1'),
('zkteco_ip_2','192.168.1.102','IP torniquete 2'),
('zkteco_ip_3','192.168.1.103','IP torniquete 3'),
('zkteco_ip_4','192.168.1.104','IP torniquete 4'),
('barrera_estac_ip','192.168.1.110','IP barrera estacionamiento'),
('barrera_kennedy_ip','192.168.1.112','IP barrera Kennedy'),
('mqtt_broker','localhost','Broker MQTT para barreras'),
('mqtt_topic_barrera_estac','club/barrera/estac/open','Topic MQTT barrera estac'),
('mqtt_topic_barrera_kennedy','club/barrera/kennedy/open','Topic MQTT barrera Kennedy')
ON DUPLICATE KEY UPDATE descripcion=VALUES(descripcion);

