-- 004_create_visits_table.sql
-- Visitas del usuario, proyectadas desde public.visits (WHERE user_id = <dueño>).
--
-- SIN user_id: el aislamiento fisico del archivo ya garantiza la pertenencia
-- (§7.2 de la guia). Guardarlo seria redundante y abriria la puerta a filtrar
-- por el en vez de confiar en el aislamiento.
--
-- SIN FOREIGN KEY hacia clients a proposito. La cartera replicada es un
-- SUBCONJUNTO derivado, y una visita puede apuntar a un cliente que quedo fuera
-- del filtro o a un potential_client. Con la FK activa esa fila reventaria el
-- sync entero; sin ella, queda un huerfano localizable. PostgreSQL es la fuente
-- de verdad: la integridad se garantiza alli, no en el read model.

CREATE TABLE IF NOT EXISTS visits (
    visit_id            INTEGER PRIMARY KEY,
    id_distributor      INTEGER NOT NULL,
    client_id           INTEGER,
    potential_client_id INTEGER,
    route_id            INTEGER,
    address_id          INTEGER,
    id_laboratory       INTEGER,

    objective           TEXT,
    promotion_target    TEXT,
    modality            TEXT,
    visit_type          TEXT,
    status              TEXT NOT NULL,
    outcome             TEXT,

    scheduled_date       TEXT,
    scheduled_start_time TEXT,
    scheduled_end_time   TEXT,
    actual_arrival_time  TEXT,
    service_started_at   TEXT,
    actual_departure_time TEXT,

    is_unplanned        INTEGER NOT NULL DEFAULT 0,
    cancellation_reason TEXT,
    topics_discussed    TEXT,
    delivered_materials TEXT,
    client_feedback     TEXT,
    observations        TEXT,

    version             INTEGER NOT NULL DEFAULT 0,
    created_at          TEXT,
    updated_at          TEXT,
    deleted_at          TEXT
);

CREATE INDEX IF NOT EXISTS idx_visits_client   ON visits(id_distributor, client_id) WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_visits_sched    ON visits(scheduled_date)            WHERE deleted_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_visits_status   ON visits(status, scheduled_date)    WHERE deleted_at IS NULL;
