-- src/db/schema.postgres.sql
-- Versão adaptada do schema.sql para PostgreSQL.
-- Diferenças principais face ao SQLite:
--   INTEGER PRIMARY KEY AUTOINCREMENT  ->  SERIAL PRIMARY KEY
--   datetime('now')                    ->  now()
--   TEXT para timestamps               ->  TIMESTAMPTZ (mais correto em Postgres)

CREATE TABLE IF NOT EXISTS utilizadores (
  id SERIAL PRIMARY KEY,
  nif TEXT NOT NULL UNIQUE,
  primeiro_nome TEXT NOT NULL,
  ultimo_nome TEXT NOT NULL,
  password_hash TEXT NOT NULL,
  role TEXT NOT NULL DEFAULT 'bombeiro',
  pessoal_id INTEGER REFERENCES pessoal(id),
  ativo INTEGER NOT NULL DEFAULT 1,
  ultimo_login_em TIMESTAMPTZ,
  criado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS contadores_ocorrencia (
  ano INTEGER PRIMARY KEY,
  ultimo_numero INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE IF NOT EXISTS pessoal (
  id SERIAL PRIMARY KEY,
  nome TEXT NOT NULL,
  indicativo TEXT,
  funcao TEXT NOT NULL DEFAULT 'Bombeiro',
  estado TEXT NOT NULL DEFAULT 'Disponivel',
  telegram_chat_id TEXT,
  telefone TEXT,
  criado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS viaturas (
  id SERIAL PRIMARY KEY,
  indicativo TEXT NOT NULL UNIQUE,
  tipo TEXT NOT NULL,
  estado TEXT NOT NULL DEFAULT 'Disponivel',
  ocorrencia_atual_id INTEGER,
  km INTEGER DEFAULT 0,
  combustivel_pct INTEGER DEFAULT 100,
  ultima_checklist_em TIMESTAMPTZ,
  version INTEGER NOT NULL DEFAULT 0,
  criado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS ocorrencias (
  id SERIAL PRIMARY KEY,
  numero TEXT NOT NULL UNIQUE,
  tipo TEXT NOT NULL,
  prioridade INTEGER NOT NULL DEFAULT 2,
  morada TEXT,
  freguesia TEXT,
  latitude REAL,
  longitude REAL,
  localidade TEXT,
  tipo_via TEXT,
  ponto_referencia TEXT,
  num_central TEXT,
  num_cdos TEXT,
  num_inem TEXT,
  queda_altura_m REAL,
  descricao TEXT,
  origem_alerta TEXT NOT NULL DEFAULT 'Telefone',
  estado_atual TEXT NOT NULL DEFAULT 'AlertaRecebido',
  operador_id INTEGER REFERENCES utilizadores(id),
  relatorio_final TEXT,
  aberta_em TIMESTAMPTZ NOT NULL DEFAULT now(),
  fechada_em TIMESTAMPTZ,
  version INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE IF NOT EXISTS vitimas (
  id SERIAL PRIMARY KEY,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  idade_aprox INTEGER,
  sexo TEXT,
  gravidade TEXT,
  transportado_para TEXT,
  criado_em TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE TABLE IF NOT EXISTS ocorrencia_meios (
  id SERIAL PRIMARY KEY,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  viatura_id INTEGER NOT NULL REFERENCES viaturas(id),
  estado TEXT NOT NULL DEFAULT 'Despachada',
  despachada_em TIMESTAMPTZ NOT NULL DEFAULT now(),
  a_caminho_em TIMESTAMPTZ,
  no_local_em TIMESTAMPTZ,
  regresso_em TIMESTAMPTZ,
  disponivel_em TIMESTAMPTZ,
  km_saida INTEGER,
  km_regresso INTEGER,
  checklist_ok INTEGER NOT NULL DEFAULT 0,
  version INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE IF NOT EXISTS ocorrencia_meio_pessoal (
  id SERIAL PRIMARY KEY,
  ocorrencia_meio_id INTEGER NOT NULL REFERENCES ocorrencia_meios(id),
  pessoal_id INTEGER NOT NULL REFERENCES pessoal(id),
  confirmado_em TIMESTAMPTZ,
  escalado_timeout INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE IF NOT EXISTS historico_estados (
  id SERIAL PRIMARY KEY,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  ocorrencia_meio_id INTEGER REFERENCES ocorrencia_meios(id),
  timestamp TIMESTAMPTZ NOT NULL DEFAULT now(),
  tipo_evento TEXT NOT NULL,
  estado_anterior TEXT,
  estado_novo TEXT,
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema',
  nota TEXT
);

CREATE INDEX IF NOT EXISTS idx_hist_ocorrencia ON historico_estados(ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_om_ocorrencia ON ocorrencia_meios(ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_om_viatura ON ocorrencia_meios(viatura_id);
CREATE INDEX IF NOT EXISTS idx_ocorrencias_estado ON ocorrencias(estado_atual);
CREATE INDEX IF NOT EXISTS idx_utilizadores_nif ON utilizadores(nif);
