CREATE TABLE personas (
    id_persona        INT AUTO_INCREMENT PRIMARY KEY,
    nombre            VARCHAR(100) NOT NULL,
    apellido_p        VARCHAR(100) NOT NULL,
    apellido_m        VARCHAR(100),
    telefono          VARCHAR(20),
    email             VARCHAR(150),
    pass              TEXT,
    clave_rfid        VARCHAR(100) NULL,
    rfid_activado     TINYINT(1) NOT NULL DEFAULT 0,
    clave_qr          VARCHAR(100) NULL,
    qr_activado       TINYINT(1) NOT NULL DEFAULT 0,
    clave_teclado     VARCHAR(100) NULL,
    teclado_activado  TINYINT(1) NOT NULL DEFAULT 0,
    activo            TINYINT(1) NOT NULL DEFAULT 1,
    adeudo            TINYINT(1) NOT NULL DEFAULT 0,
    fecha_registro    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE pacientes (
    id_paciente      INT AUTO_INCREMENT PRIMARY KEY,
    id_persona       INT NOT NULL,
    numero_externo   VARCHAR(50),
    fecha_nacimiento DATE,
    sexo             ENUM('M','F','OTRO') NULL,
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE medicos (
    id_medico    INT AUTO_INCREMENT PRIMARY KEY,
    id_persona   INT NOT NULL,
    cedula_prof  VARCHAR(50),
    especialidad VARCHAR(100),
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE personal_apoyo (
    id_apoyo    INT AUTO_INCREMENT PRIMARY KEY,
    id_persona  INT NOT NULL,
    tipo_apoyo  ENUM('LIMPIEZA','MANTENIMIENTO','ENFERMERIA','OTRO') NOT NULL,
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE cuartos (
    id_cuarto        INT AUTO_INCREMENT PRIMARY KEY,
    codigo           VARCHAR(50) NOT NULL,
    piso             VARCHAR(20),
    tipo_cuarto      ENUM('HABITACION','UCI','QUIROFANO','OTRO') NOT NULL DEFAULT 'HABITACION',
    descripcion      VARCHAR(255),
    activo           TINYINT(1) NOT NULL DEFAULT 1,
    admite_pacientes TINYINT(1) NOT NULL DEFAULT 1,
    fecha_creacion   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uq_cuarto_codigo (codigo)
) ENGINE=InnoDB;

CREATE TABLE dispositivos_acceso (
    id_dispositivo   INT AUTO_INCREMENT PRIMARY KEY,
    id_cuarto        INT NOT NULL,
    nombre           VARCHAR(100) NOT NULL,
    tipo             ENUM('LECTOR_RFID','LECTOR_QR','TECLADO','OTRO') NOT NULL,
    identificador_hw VARCHAR(100),
    activo           TINYINT(1) NOT NULL DEFAULT 1,
    hash_            TEXT NULL,
    FOREIGN KEY (id_cuarto) REFERENCES cuartos(id_cuarto)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE admisiones (
    id_admision    INT AUTO_INCREMENT PRIMARY KEY,
    id_paciente    INT NOT NULL,
    id_cuarto      INT NOT NULL,
    fecha_ingreso  DATETIME NOT NULL,
    fecha_egreso   DATETIME NULL,
    motivo_ingreso VARCHAR(255),
    estado         ENUM('ACTIVA','CERRADA','CANCELADA') NOT NULL DEFAULT 'ACTIVA',
    FOREIGN KEY (id_paciente) REFERENCES pacientes(id_paciente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    FOREIGN KEY (id_cuarto) REFERENCES cuartos(id_cuarto)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE cuentas_paciente (
    id_cuenta      INT AUTO_INCREMENT PRIMARY KEY,
    id_admision    INT NOT NULL,
    fecha_apertura DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    fecha_cierre   DATETIME NULL,
    estado         ENUM('ABIERTA','CERRADA','EN_REVISION') NOT NULL DEFAULT 'ABIERTA',
    observaciones  VARCHAR(255),
    FOREIGN KEY (id_admision) REFERENCES admisiones(id_admision)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE tipos_cargo (
    id_tipo_cargo INT AUTO_INCREMENT PRIMARY KEY,
    nombre        VARCHAR(100) NOT NULL,
    descripcion   VARCHAR(255),
    activo        TINYINT(1) NOT NULL DEFAULT 1
) ENGINE=InnoDB;

CREATE TABLE cargos_cuenta (
    id_cargo      INT AUTO_INCREMENT PRIMARY KEY,
    id_cuenta     INT NOT NULL,
    id_tipo_cargo INT NOT NULL,
    descripcion   VARCHAR(255),
    cantidad      DECIMAL(10,2) NOT NULL,
    fecha_cargo   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    cancelado     TINYINT(1) NOT NULL DEFAULT 0,
    FOREIGN KEY (id_cuenta) REFERENCES cuentas_paciente(id_cuenta)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    FOREIGN KEY (id_tipo_cargo) REFERENCES tipos_cargo(id_tipo_cargo)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE pagos_cuenta (
    id_pago     INT AUTO_INCREMENT PRIMARY KEY,
    id_cuenta   INT NOT NULL,
    fecha_pago  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    monto       DECIMAL(10,2) NOT NULL,
    forma_pago  ENUM('EFECTIVO','TARJETA','TRANSFERENCIA','SEGURO','OTRO') NOT NULL,
    referencia  VARCHAR(100),
    FOREIGN KEY (id_cuenta) REFERENCES cuentas_paciente(id_cuenta)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE expedientes (
    id_expediente  INT AUTO_INCREMENT PRIMARY KEY,
    id_paciente    INT NOT NULL,
    id_admision    INT NULL,
    fecha_creacion DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    resumen        TEXT,
    FOREIGN KEY (id_paciente) REFERENCES pacientes(id_paciente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    FOREIGN KEY (id_admision) REFERENCES admisiones(id_admision)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE notas_expediente (
    id_nota       INT AUTO_INCREMENT PRIMARY KEY,
    id_expediente INT NOT NULL,
    id_persona    INT NULL,
    fecha_nota    DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    tipo_nota     ENUM('INGRESO','EVOLUCION','INDICACION','INTERCONSULTA','OTRA') NOT NULL,
    contenido     TEXT NOT NULL,
    FOREIGN KEY (id_expediente) REFERENCES expedientes(id_expediente)
        ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE tokens_acceso (
    id_token         BIGINT AUTO_INCREMENT PRIMARY KEY,
    id_persona       INT NOT NULL,
    tipo             ENUM('QR','PIN') NOT NULL,
    codigo           VARCHAR(100) NOT NULL,
    valido_desde     DATETIME NOT NULL,
    valido_hasta     DATETIME NOT NULL,
    id_cuarto        INT NULL,
    uso_maximo       INT NOT NULL DEFAULT 1,
    usos_realizados  INT NOT NULL DEFAULT 0,
    fecha_ultimo_uso DATETIME NULL,
    origen           VARCHAR(50) NULL,
    activo           TINYINT(1) NOT NULL DEFAULT 1,
    UNIQUE KEY uq_tipo_codigo (tipo, codigo),
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (id_cuarto) REFERENCES cuartos(id_cuarto)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE movimientos_acceso (
    id_movimiento    BIGINT AUTO_INCREMENT PRIMARY KEY,
    id_persona       INT NULL,
    id_cuarto        INT NOT NULL,
    id_dispositivo   INT NULL,
    tipo_credencial  ENUM('RFID','QR','PIN','OTRO') NOT NULL,
    valor_credencial VARCHAR(100) NULL,
    id_token         BIGINT NULL,
    fecha_hora       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    resultado        ENUM('PERMITIDO','DENEGADO','ERROR') NOT NULL,
    motivo           VARCHAR(255) NULL,
    FOREIGN KEY (id_persona) REFERENCES personas(id_persona)
        ON UPDATE CASCADE ON DELETE SET NULL,
    FOREIGN KEY (id_cuarto) REFERENCES cuartos(id_cuarto)
        ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (id_dispositivo) REFERENCES dispositivos_acceso(id_dispositivo)
        ON UPDATE CASCADE ON DELETE SET NULL,
    FOREIGN KEY (id_token) REFERENCES tokens_acceso(id_token)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;