-- migrate:up

CREATE TABLE state.live_positions (
    imei            text PRIMARY KEY REFERENCES domain.devices(imei),
    vehicle_id      bigint NOT NULL REFERENCES domain.vehicles(vehicle_id),
    occurred_at     timestamptz NOT NULL,
    geom            geometry(Point, 4326) NOT NULL,
    speed_kmh       numeric,
    direction_deg   numeric,
    acc_state       int,
    source          text NOT NULL,
    parser_version  int NOT NULL,
    updated_at      timestamptz NOT NULL DEFAULT now()
);

CREATE INDEX live_positions_vehicle_idx ON state.live_positions (vehicle_id);
CREATE INDEX live_positions_occurred_idx ON state.live_positions (occurred_at DESC);

CREATE TABLE state.position_history (
    history_id      bigserial,
    vehicle_id      bigint NOT NULL REFERENCES domain.vehicles(vehicle_id),
    imei            text NOT NULL,
    occurred_at     timestamptz NOT NULL,
    geom            geometry(Point, 4326) NOT NULL,
    speed_kmh       numeric,
    direction_deg   numeric,
    acc_state       int,
    altitude_m      numeric,
    satellites      int,
    source          text NOT NULL,
    parser_version  int NOT NULL,
    inserted_at     timestamptz NOT NULL DEFAULT now(),
    PRIMARY KEY (history_id, occurred_at)
);

SELECT create_hypertable('state.position_history', 'occurred_at', chunk_time_interval => INTERVAL '7 days');

CREATE INDEX position_history_vehicle_time_idx
    ON state.position_history (vehicle_id, occurred_at DESC);

CREATE INDEX position_history_imei_time_idx
    ON state.position_history (imei, occurred_at DESC);

CREATE INDEX position_history_geom_idx
    ON state.position_history USING GIST (geom);

-- migrate:down

DROP TABLE IF EXISTS state.position_history;
DROP TABLE IF EXISTS state.live_positions;
