-- =========================================
-- Utilidades (catálogos básicos)
-- =========================================
create table rol (
  id      uuid primary key,
  codigo  varchar(40) unique -- GUARDIA | SUPERVISOR | CONTROL | LEGAL_REP | ADMIN
);

-- =========================================
-- Cliente (empresa) y su estructura
-- =========================================
create table cliente (
  id             uuid primary key,
  razon_social   varchar(200),
  ruc            varchar(20) unique,
  -- auditoría
  created_at     timestamptz default now(),
  created_by     uuid,
  updated_at     timestamptz,
  updated_by     uuid,
  deleted_at     timestamptz
);

create table unidad (
  id            uuid primary key,
  id_cliente    uuid references cliente(id),
  nombre        varchar(120),
  direccion     varchar(200),
  lat           numeric(10,6),
  lng           numeric(10,6),
  -- auditoría
  created_at    timestamptz default now(),
  created_by    uuid,
  updated_at    timestamptz,
  updated_by    uuid,
  deleted_at    timestamptz
);

create table subunidad (
  id            uuid primary key,
  id_unidad     uuid references unidad(id),
  nombre        varchar(120),
  -- auditoría
  created_at    timestamptz default now(),
  created_by    uuid,
  updated_at    timestamptz,
  updated_by    uuid,
  deleted_at    timestamptz
);

-- =========================================
-- Usuarios y roles (con alcance por cliente)
-- =========================================
create table usuario (
  id                uuid primary key,
  usuario           varchar(80)  unique,
  email             varchar(120) unique,
  contrasena_hash   varchar(255),
  telefono          varchar(30),
  tipo_documento    varchar(3),   -- DNI | CE | PAS | ...
  numero_documento  varchar(20),
  estado            smallint,      -- 1 activo / 0 inactivo
  -- auditoría
  created_at        timestamptz default now(),
  created_by        uuid,
  updated_at        timestamptz,
  updated_by        uuid,
  deleted_at        timestamptz
);

create table usuario_rol (
  id           uuid primary key,
  id_usuario   uuid references usuario(id),
  id_rol       uuid references rol(id),
  id_cliente   uuid,                 -- NULL = rol global; set si es por cliente
  unique (id_usuario, id_rol, id_cliente)
);

-- Asignación de guardias a unidades de un cliente
create table usuario_unidad (
  id          uuid primary key,
  id_usuario  uuid references usuario(id),
  id_unidad   uuid references unidad(id),
  unique (id_usuario, id_unidad)
);

-- =========================================
-- Sesión (por cliente/unidad/subunidad) con cierre y auditoría
-- =========================================
create table session (
  id                 uuid primary key,
  id_usuario         uuid references usuario(id),
  id_cliente         uuid references cliente(id),
  id_unidad          uuid references unidad(id),
  id_subunidad       uuid references subunidad(id),

  fecha_inicio       timestamptz default now(),
  ruta_foto_inicio   varchar(500),

  -- Cierre (único por sesión)
  fecha_fin          timestamptz,
  equipos_a_cargo    jsonb,              -- checklist consolidado
  otros_detalle      varchar(255),
  descripcion_cierre varchar(1000),

  -- auditoría
  created_at         timestamptz default now(),
  created_by         uuid,
  updated_at         timestamptz,
  updated_by         uuid,
  deleted_at         timestamptz
);
create index idx_session_usuario on session(id_usuario);
create index idx_session_cliente on session(id_cliente);

create table session_evidencia (
  id          uuid primary key,
  id_session  uuid references session(id),
  ruta_foto   varchar(500),
  -- auditoría
  created_at  timestamptz default now(),
  created_by  uuid,
  updated_at  timestamptz,
  updated_by  uuid,
  deleted_at  timestamptz
);

-- =========================================
-- Botón de pánico (ligado a sesión)
-- =========================================
create table panic_alert (
  id          uuid primary key,
  id_session  uuid references session(id),
  fecha_hora  timestamptz default now(),
  lat         numeric(10,6),
  lng         numeric(10,6),
  mensaje     varchar(500),
  estado      varchar(20),           -- ENVIADA | ATENDIDA | CANCELADA
  -- auditoría
  created_at  timestamptz default now(),
  created_by  uuid,
  updated_at  timestamptz,
  updated_by  uuid,
  deleted_at  timestamptz
);

create table panic_alert_adjunto (
  id         uuid primary key,
  id_alerta  uuid references panic_alert(id),
  tipo       varchar(20),            -- imagen | audio | texto
  ruta       varchar(500),
  -- auditoría
  created_at timestamptz default now(),
  created_by uuid,
  updated_at timestamptz,
  updated_by uuid,
  deleted_at timestamptz
);

create table panic_alert_recepcion (
  id                   uuid primary key,
  id_alerta            uuid references panic_alert(id),
  id_usuario_receptor  uuid references usuario(id),
  fecha_hora           timestamptz default now(),
  -- auditoría
  created_at           timestamptz default now(),
  created_by           uuid,
  updated_at           timestamptz,
  updated_by           uuid,
  deleted_at           timestamptz
);

-- =========================================
-- Rondas (QR / GPS) por cliente/unidad
-- =========================================
create table control_point (
  id           uuid primary key,
  id_cliente   uuid references cliente(id),
  id_unidad    uuid references unidad(id),
  id_subunidad uuid references subunidad(id),
  nombre       varchar(120),
  codigo_qr    varchar(120),
  lat          numeric(10,6),
  lng          numeric(10,6),
  -- auditoría
  created_at   timestamptz default now(),
  created_by   uuid,
  updated_at   timestamptz,
  updated_by   uuid,
  deleted_at   timestamptz
);

create table ronda (
  id               uuid primary key,
  id_session       uuid references session(id),
  id_control_point uuid references control_point(id), -- NULL si GPS
  fecha_hora       timestamptz default now(),
  lat              numeric(10,6),
  lng              numeric(10,6),
  descripcion      varchar(500),
  -- auditoría
  created_at       timestamptz default now(),
  created_by       uuid,
  updated_at       timestamptz,
  updated_by       uuid,
  deleted_at       timestamptz
);
create index idx_ronda_session on ronda(id_session);

create table ronda_adjunto (
  id         uuid primary key,
  id_ronda   uuid references ronda(id),
  ruta_foto  varchar(500),
  -- auditoría
  created_at timestamptz default now(),
  created_by uuid,
  updated_at timestamptz,
  updated_by uuid,
  deleted_at timestamptz
);

-- =========================================
-- Incidencias (1 por ronda opcional) y puestos por cliente
-- =========================================
create table incidente_tipo (
  id      uuid primary key,
  nombre  varchar(80),
  -- auditoría
  created_at timestamptz default now(),
  created_by uuid,
  updated_at timestamptz,
  updated_by uuid,
  deleted_at timestamptz
);

create table puesto (
  id           uuid primary key,
  id_cliente   uuid references cliente(id),
  id_unidad    uuid references unidad(id),
  nombre       varchar(120),
  -- auditoría
  created_at   timestamptz default now(),
  created_by   uuid,
  updated_at   timestamptz,
  updated_by   uuid,
  deleted_at   timestamptz
);

create table incidencia (
  id                 uuid primary key,
  id_session         uuid references session(id),
  id_ronda           uuid references ronda(id),             -- NULL si no viene de ronda
  id_incidente_tipo  uuid references incidente_tipo(id),
  id_puesto          uuid references puesto(id),
  fecha_hora         timestamptz default now(),
  lat                numeric(10,6),
  lng                numeric(10,6),
  descripcion        varchar(1000),
  -- auditoría
  created_at         timestamptz default now(),
  created_by         uuid,
  updated_at         timestamptz,
  updated_by         uuid,
  deleted_at         timestamptz,
  unique (id_ronda)                                          -- fuerza 1 incidencia por ronda
);

create table incidencia_adjunto (
  id            uuid primary key,
  id_incidencia uuid references incidencia(id),
  ruta_foto     varchar(500),
  -- auditoría
  created_at    timestamptz default now(),
  created_by    uuid,
  updated_at    timestamptz,
  updated_by    uuid,
  deleted_at    timestamptz
);

-- =========================================
-- Hombre Vivo (centro de control / supervisor -> guardia)
-- =========================================
create table alive_check (
  id                uuid primary key,
  id_usuario_emisor uuid references usuario(id),   -- CONTROL o SUPERVISOR
  id_session_dest   uuid references session(id),   -- sesión del guardia
  fecha_hora_envio  timestamptz default now(),
  timeout_seg       int,                           -- p.ej. 12
  estado            varchar(20),                   -- ENVIADA | ACEPTADA | NO_ACEPTADA | EXPIRADA
  -- auditoría
  created_at        timestamptz default now(),
  created_by        uuid,
  updated_at        timestamptz,
  updated_by        uuid,
  deleted_at        timestamptz
);

create table alive_check_respuesta (
  id                   uuid primary key,
  id_alive_check       uuid references alive_check(id),
  id_session_respuesta uuid references session(id),
  fecha_hora_respuesta timestamptz,
  aceptado             boolean,
  ruta_foto            varchar(500),
  lat                  numeric(10,6),
  lng                  numeric(10,6),
  -- auditoría
  created_at           timestamptz default now(),
  created_by           uuid,
  updated_at           timestamptz,
  updated_by           uuid,
  deleted_at           timestamptz
);

-- =========================================
-- Asignaciones (por cliente/unidad)
-- =========================================
create table asignacion (
  id                  uuid primary key,
  id_cliente          uuid references cliente(id),
  id_unidad           uuid references unidad(id),
  codigo              varchar(40),
  tipo                varchar(80),
  direccion           varchar(200),
  descripcion         varchar(1000),
  lat                 numeric(10,6),
  lng                 numeric(10,6),
  id_usuario_asignado uuid references usuario(id),
  estado              varchar(20),                 -- PENDIENTE | EN_PROCESO | ATENDIDA | CANCELADA
  fecha_creacion      timestamptz default now(),
  -- auditoría
  created_at          timestamptz default now(),
  created_by          uuid,
  updated_at          timestamptz,
  updated_by          uuid,
  deleted_at          timestamptz
);

create table asignacion_evento (
  id            uuid primary key,
  id_asignacion uuid references asignacion(id),
  id_session    uuid references session(id),
  fecha_hora    timestamptz,
  accion        varchar(20),                      -- INICIAR | FINALIZAR | CANCELAR
  -- auditoría
  created_at    timestamptz default now(),
  created_by    uuid,
  updated_at    timestamptz,
  updated_by    uuid,
  deleted_at    timestamptz
);

-- =========================================
-- Ocurrencias (tipos indicados; por cliente si deseas parametrizar)
-- =========================================
create table ocurrencia_tipo (
  id          uuid primary key,
  id_cliente  uuid,                -- NULL = global; set si catálogo por cliente
  nombre      varchar(120),
  unique (id_cliente, nombre),
  -- auditoría
  created_at  timestamptz default now(),
  created_by  uuid,
  updated_at  timestamptz,
  updated_by  uuid,
  deleted_at  timestamptz
);

create table ocurrencia (
  id                 uuid primary key,
  id_session         uuid references session(id),
  id_puesto          uuid references puesto(id),
  id_ocurrencia_tipo uuid references ocurrencia_tipo(id),
  descripcion        varchar(1000),
  fecha_hora         timestamptz default now(),
  -- auditoría
  created_at         timestamptz default now(),
  created_by         uuid,
  updated_at         timestamptz,
  updated_by         uuid,
  deleted_at         timestamptz
);

create table ocurrencia_adjunto (
  id             uuid primary key,
  id_ocurrencia  uuid references ocurrencia(id),
  ruta_foto      varchar(500),
  -- auditoría
  created_at     timestamptz default now(),
  created_by     uuid,
  updated_at     timestamptz,
  updated_by     uuid,
  deleted_at     timestamptz
);

-- Índices útiles
create index idx_asignacion_usuario on asignacion(id_usuario_asignado);
create index idx_control_point_cliente on control_point(id_cliente);
