-- Schema central de dispache
-- Compatível com SQLite. Para Postgres: AUTOINCREMENT -> SERIAL/IDENTITY,
-- TEXT para datas funciona em ambos (ISO 8601), ver docs/MIGRACAO_POSTGRES.md

-- Utilizadores do sistema: login por NIF, perfil/role determina permissões.
-- pessoal_id liga opcionalmente ao registo operacional (turnos/escalas),
-- mas um utilizador pode existir sem estar ainda associado a um pessoal_id
-- (ex: operador de central administrativo sem ser bombeiro de equipa).
CREATE TABLE IF NOT EXISTS utilizadores (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  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', -- admin | comandante | operador | bombeiro
  pessoal_id INTEGER REFERENCES pessoal(id),
  pode_operar_central INTEGER NOT NULL DEFAULT 0, -- bombeiro marcado para fazer turnos de operador de central
  precisa_mudar_password INTEGER NOT NULL DEFAULT 0, -- forçado após reset de password pelo admin
  ativo INTEGER NOT NULL DEFAULT 1,
  ultimo_login_em TEXT,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Contador de sequência por ano para gerar números de ocorrência sem
-- race condition (ver src/services/numeracao.js — usa UPDATE...RETURNING
-- ou transação serializada, nunca "ler último número e incrementar em JS").
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 INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL,
  indicativo TEXT,
  funcao TEXT NOT NULL DEFAULT 'Bombeiro',
  estado TEXT NOT NULL DEFAULT 'Disponivel', -- Disponivel | EmServico | Ausente
  telegram_chat_id TEXT,
  telefone TEXT,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Tipologia de viaturas operacionais dos Corpos de Bombeiros, conforme
-- regulamentação da ANEPC (Despacho 21638/2009 e atualizações, Despacho
-- 1240/2024). sigla é o que aparece no indicativo/dropdown; designacao é
-- o nome completo, para referência. ativo permite "desativar" tipos sem
-- apagar (preserva o histórico de viaturas já criadas com esse tipo).
CREATE TABLE IF NOT EXISTS tipos_viatura (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  sigla TEXT NOT NULL UNIQUE,
  designacao TEXT NOT NULL,
  categoria TEXT, -- Combate a Incêndios | Socorro/Saúde | Comando | Apoio | Outro
  -- categoria_estado_meio: liga esta sigla a uma categoria do catálogo
  -- de Estados de Meios (ex: 'Combate a Incêndios (VLCI, VUCI, VFCI,
  -- VTTF)'). NULL quando não há correspondência clara ainda (ex:
  -- Comando, embarcações, apoio alimentar) — nesses casos a viatura
  -- despachada não recebe nenhum Estado de Meio automático, confirmado
  -- explicitamente pelo utilizador. Texto livre, igual à categoria de
  -- estados_meio (não há validação cruzada rígida, só por convenção).
  categoria_estado_meio TEXT,
  descricao TEXT,
  ativo INTEGER NOT NULL DEFAULT 1,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Postos (categorias) de bombeiro em Portugal, cobrindo as carreiras
-- oficiais dos corpos de Voluntários, Mistos, Sapadores (profissionais
-- municipais) e Privados, conforme o regime jurídico dos corpos de
-- bombeiros (DL 247/2007, DL 241/2007) e os quadros de pessoal típicos
-- (Quadro de Comando, Quadro Ativo - Oficial Bombeiro / Bombeiro /
-- Bombeiro Especialista). ordem permite listar a hierarquia em sequência
-- lógica em vez de alfabética.
CREATE TABLE IF NOT EXISTS postos_bombeiro (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  nome TEXT NOT NULL UNIQUE,
  carreira TEXT, -- Comando | Oficial Bombeiro | Bombeiro | Bombeiro Especialista | Outro
  aplicavel_a TEXT, -- Voluntários | Sapadores | Privados | Municipais | Todos
  ordem INTEGER NOT NULL DEFAULT 0,
  descricao TEXT,
  ativo INTEGER NOT NULL DEFAULT 1,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

CREATE TABLE IF NOT EXISTS viaturas (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  indicativo TEXT NOT NULL UNIQUE,
  tipo TEXT NOT NULL, -- sigla referente a tipos_viatura.sigla (ex: VTTU, ABSC)
  estado TEXT NOT NULL DEFAULT 'Disponivel', -- Disponivel | EmManutencao | Indisponivel | Empenhada
  ocorrencia_atual_id INTEGER,
  km INTEGER DEFAULT 0,
  combustivel_pct INTEGER DEFAULT 100,
  ultima_checklist_em TEXT,
  version INTEGER NOT NULL DEFAULT 0, -- lock otimista
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Catálogo de Tipos de Ocorrência — geríveis por categoria, usado SÓ para
-- colorir o CRONÓMETRO GERAL da ocorrência no dashboard, com base no
-- tempo decorrido desde aberta_em. Totalmente independente de
-- estados_livres (que controla a cor do bloco de estado, escolhido
-- manualmente). Os limiares vêm da tabela de referência fornecida pelo
-- utilizador ("ACG – Duração Total das Ocorrências"), convertendo os
-- intervalos Normal/Prolongado/Crítico/Anómalo em 3 pontos de corte (em
-- minutos): a partir de limiar_critico_fim_min sem mais nenhum limite
-- definido, considera-se Anómalo.
-- cor_normal/cor_prolongado/cor_critico/cor_anomalo: cor de cada nível,
-- ESCOLHIDA POR TIPO (não fixa universalmente) — mesma paleta de 14 cores
-- já usada em estados_livres/estados_meio. Valor por defeito ao criar
-- (verde/ambar/laranja/vermelho) reflete o que estava fixo no código
-- antes desta funcionalidade existir; fica editável a partir daqui.
CREATE TABLE IF NOT EXISTS tipos_ocorrencia (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  categoria TEXT NOT NULL, -- Incendio | Acidente | PreHospitalar | MateriasPerigosas | Calamidade
  nome TEXT NOT NULL,
  limiar_normal_fim_min INTEGER NOT NULL,
  limiar_prolongado_fim_min INTEGER NOT NULL,
  limiar_critico_fim_min INTEGER NOT NULL,
  cor_normal TEXT NOT NULL DEFAULT 'verde',
  cor_prolongado TEXT NOT NULL DEFAULT 'ambar',
  cor_critico TEXT NOT NULL DEFAULT 'laranja',
  cor_anomalo TEXT NOT NULL DEFAULT 'vermelho',
  ordem INTEGER NOT NULL DEFAULT 0,
  ativo INTEGER NOT NULL DEFAULT 1,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  UNIQUE(categoria, nome)
);

CREATE INDEX IF NOT EXISTS idx_tipos_ocorrencia_categoria ON tipos_ocorrencia(categoria, ordem);

CREATE TABLE IF NOT EXISTS ocorrencias (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  numero TEXT NOT NULL UNIQUE, -- ex: 2026/0042
  tipo TEXT NOT NULL,
  categoria TEXT NOT NULL DEFAULT 'Acidente',
  -- Incendio | Acidente | PreHospitalar | MateriasPerigosas | Calamidade
  -- Define qual catálogo de estados_livres fica disponível para esta
  -- ocorrência (ver tabela estados_livres). Escolhida na criação.
  subtipo_incendio TEXT,
  -- Urbano | Florestal — só relevante quando categoria='Incendio'. Define
  -- qual das 2 fichas de reconhecimento tático aparece na ficha de
  -- detalhe (reconhecimento_incendio_urbano vs reconhecimento_incendio_florestal),
  -- porque o SGO oficial usa guias de comando completamente diferentes
  -- para incêndio estrutural (hidrantes, tipo de edifício) vs florestal
  -- (combustível, declive, acessos). Obrigatório no formulário quando a
  -- categoria é Incendio; fica NULL para as outras categorias.
  estado_livre_id INTEGER REFERENCES estados_livres(id),
  -- Estado escolhido MANUALMENTE pelo operador (cor + descrição no
  -- dashboard) — substitui a barra de 5 fases automática como fonte da
  -- aparência visual da ocorrência. estado_atual abaixo continua a
  -- existir e a ser calculado pela máquina de estados (incluindo a
  -- reabertura automática), mas passa a ser só um campo interno/auditoria
  -- — já não pinta o dashboard.
  tipo_ocorrencia_id INTEGER REFERENCES tipos_ocorrencia(id),
  -- Tipo específico (ex: "Acidente Simples", "Grande Incêndio Rural"),
  -- escolhido na criação a partir do catálogo tipos_ocorrencia, filtrado
  -- pela categoria já escolhida. USADO SÓ para colorir o CRONÓMETRO GERAL
  -- da ocorrência no dashboard (verde/amarelo/laranja/vermelho conforme o
  -- tempo decorrido) — totalmente independente de estado_livre_id /
  -- estado_livre_cor. NÃO confundir com a coluna `tipo` acima (texto
  -- livre, continua a funcionar exatamente como antes, sem relação com
  -- este catálogo).
  prioridade INTEGER NOT NULL DEFAULT 2, -- 1 Urgente, 2 Normal, 3 Baixa
  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', -- Telefone | 112 | Radio | Presencial | App
  estado_atual TEXT NOT NULL DEFAULT 'AlertaRecebido',
  -- AlertaRecebido | EmDespacho | MeiosDespachados | ACaminho | EmCurso
  -- | EmResolucao | Concluida | Cancelada
  operador_id INTEGER REFERENCES utilizadores(id),
  relatorio_final TEXT,
  aberta_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  fechada_em TEXT,
  trancada INTEGER NOT NULL DEFAULT 0, -- só pode ser true depois de Concluida; bloqueia edição a quem não é admin/comandante
  trancada_em TEXT,
  trancada_por_id INTEGER REFERENCES utilizadores(id),
  version INTEGER NOT NULL DEFAULT 0 -- lock otimista: toda a UPDATE de estado valida e incrementa
);

-- Catálogo de Estados Livres — geríveis (criar/editar/apagar), agrupados
-- por categoria de ocorrência. Cada ocorrência só pode escolher entre os
-- estados da SUA categoria (ex: uma ocorrência "Incendio" só vê os
-- estados da categoria Incendio, nunca os de MateriasPerigosas).
-- cor é FIXA por estado (escolhida na criação/edição do estado, não a
-- cada vez que se aplica a uma ocorrência) — confirmado explicitamente.
-- Consolidado a partir dos catálogos oficiais ANEPC/DECIR, INEM/CODU,
-- GNR/PSP e CNOS fornecidos pelo utilizador, sem repetir equivalentes.
CREATE TABLE IF NOT EXISTS estados_livres (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  categoria TEXT NOT NULL, -- Incendio | Acidente | PreHospitalar | MateriasPerigosas | Calamidade
  nome TEXT NOT NULL,
  cor TEXT NOT NULL DEFAULT 'cinza', -- vermelho | ambar | verde | azul | cinza
  descricao TEXT,
  ordem INTEGER NOT NULL DEFAULT 0,
  ativo INTEGER NOT NULL DEFAULT 1,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  UNIQUE(categoria, nome)
);

CREATE INDEX IF NOT EXISTS idx_estados_livres_categoria ON estados_livres(categoria, ordem);

-- Catálogo de Estados de Meios (viaturas) — geríveis (criar/editar/
-- apagar), agrupados por categoria. Estrutura paralela a
-- estados_livres (estados de ocorrência), mas para um propósito
-- diferente, ainda a ser explicado pelo utilizador — por isso categoria
-- aqui é texto livre, sem lista fixa validada no backend (ao contrário
-- de estados_livres.categoria, que tem 5 valores fixos). Isto evita
-- ter de alterar a validação outra vez quando as categorias reais
-- chegarem.
CREATE TABLE IF NOT EXISTS estados_meio (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  categoria TEXT NOT NULL,
  nome TEXT NOT NULL,
  cor TEXT NOT NULL DEFAULT 'cinza', -- vermelho | ambar | verde | azul | cinza | laranja | roxo | rosa | castanho | preto | ciano | oliva | indigo | turquesa
  descricao TEXT,
  ordem INTEGER NOT NULL DEFAULT 0,
  ativo INTEGER NOT NULL DEFAULT 1,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  UNIQUE(categoria, nome)
);

CREATE INDEX IF NOT EXISTS idx_estados_meio_categoria ON estados_meio(categoria, ordem);

-- Ficha básica de vítima, inspirada no Verbete Nacional de Socorro (INEM) —
-- identificação, motivo da chamada, e estado de consciência pela escala
-- AVDS oficial (Alerta/Verbal/Dor/Sem resposta). Pensada para ser rápida
-- de preencher no momento (maioria por seleção, não por escrita).
CREATE TABLE IF NOT EXISTS vitimas (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  nome TEXT,
  numero_utente TEXT,
  idade_aprox INTEGER,
  sexo TEXT, -- M | F | Outro | Desconhecido
  motivo_chamada TEXT,
  estado_consciencia TEXT, -- Alerta | Verbal | Dor | SemResposta (escala AVDS)
  gravidade TEXT, -- Ileso | Leve | Grave | Obito
  transportado_para TEXT,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Lesões registadas por zona do corpo — relação N:N porque uma vítima pode
-- ter várias lesões em zonas diferentes (ex: fratura na perna + ferida na
-- cabeça). Zonas e tipos são listas fixas geridas no código da aplicação
-- (conceitos médicos estáveis, ao contrário de tipos de viatura/postos que
-- variam por quartel — não precisam de página de gestão própria).
CREATE TABLE IF NOT EXISTS vitima_lesoes (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  vitima_id INTEGER NOT NULL REFERENCES vitimas(id),
  zona_corpo TEXT NOT NULL,
  tipo_lesao TEXT NOT NULL,
  nota TEXT,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

CREATE INDEX IF NOT EXISTS idx_vitima_lesoes_vitima ON vitima_lesoes(vitima_id);

-- Triagem rápida START (Simple Triage and Rapid Treatment) — agregada à
-- OCORRÊNCIA EM GERAL (não a uma viatura específica), para classificar
-- rapidamente várias vítimas por prioridade quando há um acidente com
-- múltiplas vítimas, ANTES de qualquer verbete completo ser iniciado.
-- Algoritmo real: anda? -> respira? -> tem pulso radial? -> obedece a
-- ordens simples? (ver src/services/triagemStart.js para o cálculo).
-- identificador é só uma etiqueta rápida em texto livre (ex: "Condutor",
-- "Vítima 2", "Passageiro banco trás") — não uma ficha completa.
CREATE TABLE IF NOT EXISTS triagens_start (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  identificador TEXT NOT NULL,
  anda INTEGER, -- 1 = sim, 0 = não, NULL = não avaliado/não aplicável (já parou noutro critério)
  respira INTEGER,
  frequencia_alta INTEGER, -- true se respira mas >=30 cpm (critério Vermelho direto)
  tem_pulso INTEGER,
  obedece_ordens INTEGER,
  cor TEXT NOT NULL, -- Vermelho | Amarelo | Verde | Preto
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema',
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

CREATE INDEX IF NOT EXISTS idx_triagens_ocorrencia ON triagens_start(ocorrencia_id);

-- Verbete completo por vítima — réplica fiel (o mais possível) do Verbete
-- Nacional de Socorro do INEM. Pertence a uma VIATURA (ocorrencia_meio_id),
-- não à ocorrência em geral — uma viatura pode ter vários verbetes (mais
-- de uma vítima na mesma viatura), e um verbete pode ser TRANSFERIDO para
-- outra viatura (ver verbete_transferencias) sem perder o que já foi
-- registado — útil quando a 1ª viatura no local já começou a avaliar uma
-- vítima antes de se saber qual viatura a vai efetivamente transportar.
CREATE TABLE IF NOT EXISTS verbetes_vitima (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  ocorrencia_meio_id INTEGER NOT NULL REFERENCES ocorrencia_meios(id), -- viatura ATUAL responsável (muda em transferências)
  ocorrencia_meio_id_original INTEGER NOT NULL REFERENCES ocorrencia_meios(id), -- viatura que iniciou o verbete (nunca muda, para auditoria)

  -- Identificação
  nome TEXT,
  idade_aprox INTEGER,
  sexo TEXT, -- M | F | Outro | Desconhecido
  numero_utente TEXT,
  documento_identificacao TEXT, -- tipo de documento (CC, Passaporte, etc)
  numero_documento TEXT,
  morada_residencia TEXT,

  -- Ocorrência (específico desta vítima)
  motivo_chamada TEXT,
  chegada_vitima_em TEXT, -- hora de chegada À VÍTIMA (não à viatura/local geral)

  -- Historial clínico
  circunstancias TEXT,
  historico_doencas TEXT,
  alergias TEXT,
  medicacao_habitual TEXT,
  ultima_refeicao TEXT,
  situacao_risco TEXT, -- condição social frágil, violência doméstica, etc (campo do verbete real)

  -- Desfecho
  tipo_emergencia TEXT, -- hipótese de diagnóstico / emergência identificada
  nao_transporte TEXT, -- Abandonou o local | DecisaoMedica | Morte | RecusouEAssinou (NULL se foi transportado)
  transporte_tipo TEXT, -- Primario | Secundario
  acompanhamento_medico INTEGER NOT NULL DEFAULT 0,
  unidade_saude_origem TEXT, -- para transporte secundário
  unidade_saude_destino TEXT,
  chegada_us_em TEXT,
  episodio_us TEXT, -- nº de episódio atribuído pela unidade de saúde de destino

  observacoes TEXT,

  ativo INTEGER NOT NULL DEFAULT 1, -- false se foi fundido/cancelado (nunca apagar, preserva histórico)
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema'
);

CREATE INDEX IF NOT EXISTS idx_verbetes_ocorrencia ON verbetes_vitima(ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_verbetes_meio ON verbetes_vitima(ocorrencia_meio_id);

-- Lesões por verbete (mesmo modelo já usado em vitima_lesoes, mas para o
-- verbete completo — zonas do corpo fixas, múltiplas por verbete).
CREATE TABLE IF NOT EXISTS verbete_lesoes (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  verbete_id INTEGER NOT NULL REFERENCES verbetes_vitima(id),
  zona_corpo TEXT NOT NULL,
  tipo_lesao TEXT NOT NULL, -- Fratura | Contusao | Ferida | Hemorragia | Dor | Queimadura (cores reais do verbete: # FRATURA CONTUSÃO FERIDA HEMORRAGIA DOR QUEIMADURA)
  nota TEXT,
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

CREATE INDEX IF NOT EXISTS idx_verbete_lesoes_verbete ON verbete_lesoes(verbete_id);

-- Registos de sinais vitais — MÚLTIPLOS no tempo (tabela cronológica, tal
-- como no verbete real: cada avaliação/reavaliação é uma nova linha com a
-- sua própria hora, não um único valor que se sobrescreve). NEWS é
-- calculado a partir dos outros campos desta mesma linha (ver
-- src/services/escalaNews.js), guardado já calculado para não recalcular
-- sempre que se lê o histórico.
CREATE TABLE IF NOT EXISTS verbete_sinais_vitais (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  verbete_id INTEGER NOT NULL REFERENCES verbetes_vitima(id),
  hora TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  avds TEXT, -- Alerta | Verbal | Dor | SemResposta
  gcs_ocular INTEGER, -- 1-4
  gcs_verbal INTEGER, -- 1-5
  gcs_motora INTEGER, -- 1-6
  gcs_total INTEGER, -- 3-15, calculado (ocular+verbal+motora) mas guardado para histórico
  frequencia_ventilatoria INTEGER, -- cpm
  spo2 INTEGER, -- %
  o2_suplementar REAL, -- l/min
  etco2 INTEGER, -- mmHg
  pulso INTEGER, -- bpm
  ecg TEXT, -- descrição livre do ritmo (o verbete real remete para "ver verso", aqui é só texto)
  pa_sistolica INTEGER,
  pa_diastolica INTEGER,
  pele TEXT, -- ex: Normocorada, Pálida, Cianosada, Sudorenta
  temperatura REAL, -- ºC
  pupilas TEXT, -- ex: Isocóricas e reativas, Anisocóricas, Mióticas, Midriáticas
  dor INTEGER, -- 0-10
  glicemia INTEGER, -- mg/dl
  news_total INTEGER, -- 0 a 18ish, calculado
  news_classificacao TEXT, -- Verde | Amarelo | Vermelho (1-4 / 5+ou parametro=3 / 7)
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema'
);

CREATE INDEX IF NOT EXISTS idx_sinais_vitais_verbete ON verbete_sinais_vitais(verbete_id);

-- Terapêutica administrada — múltiplas linhas (Fármaco, Dose, Via, Efeitos
-- Adversos), tal como na secção "Exame da Vítima, Procedimentos e
-- Terapêutica" do verbete real.
CREATE TABLE IF NOT EXISTS verbete_farmacos (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  verbete_id INTEGER NOT NULL REFERENCES verbetes_vitima(id),
  hora TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  farmaco TEXT NOT NULL,
  dose TEXT,
  via TEXT, -- ex: EV, IM, Oral, SC, Inalatória
  efeitos_adversos TEXT,
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema'
);

CREATE INDEX IF NOT EXISTS idx_farmacos_verbete ON verbete_farmacos(verbete_id);

-- Histórico de transferências de um verbete entre viaturas — auditoria
-- completa de quem iniciou, para onde foi, quando, e por quem foi feita a
-- transferência. Cenário real: a 1ª viatura no local começa a avaliar uma
-- vítima antes de se saber quem a vai transportar; quando a 2ª viatura
-- assume, o verbete (já com dados preenchidos) muda de "proprietário" sem
-- perder nada do que já foi registado.
CREATE TABLE IF NOT EXISTS verbete_transferencias (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  verbete_id INTEGER NOT NULL REFERENCES verbetes_vitima(id),
  de_ocorrencia_meio_id INTEGER NOT NULL REFERENCES ocorrencia_meios(id),
  para_ocorrencia_meio_id INTEGER NOT NULL REFERENCES ocorrencia_meios(id),
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema',
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

CREATE INDEX IF NOT EXISTS idx_transferencias_verbete ON verbete_transferencias(verbete_id);

-- Relação ocorrência <-> viatura, com o seu mini-estado de empenhamento
CREATE TABLE IF NOT EXISTS ocorrencia_meios (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  viatura_id INTEGER NOT NULL REFERENCES viaturas(id),
  estado TEXT NOT NULL DEFAULT 'Despachada',
  -- Despachada | ACaminho | NoLocal | EmRegresso | Disponivel | Cancelada
  -- — progresso físico da viatura nesta ocorrência. NÃO TOCAR: a
  -- sub-categoria de estado abaixo (estado_meio_id) é propositadamente
  -- isolada disto, são dois conceitos independentes que coexistem.
  estado_meio_id INTEGER REFERENCES estados_meio(id),
  -- Estado "livre" desta viatura, escolhido do catálogo de Estados de
  -- Meios (ex: "Em Operações", "Abastecimento de Água") — atribuído
  -- automaticamente ao despachar, a partir da categoria mapeada pelo
  -- tipo da viatura (tipos_viatura.categoria_estado_meio), e depois
  -- editável manualmente, igual ao botão "Atualizar Estado" já
  -- existente na ocorrência geral. Fica NULL se o tipo da viatura não
  -- tiver categoria mapeada ainda (ex: Comando, embarcações) — sem
  -- erro, simplesmente sem sub-estado automático nesse caso.
  despachada_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  a_caminho_em TEXT,
  no_local_em TEXT,
  regresso_em TEXT,
  chegada_us_em TEXT,
  disponivel_em TEXT,
  km_saida INTEGER,
  km_regresso INTEGER,
  checklist_ok INTEGER NOT NULL DEFAULT 0,
  version INTEGER NOT NULL DEFAULT 0 -- lock otimista
);

CREATE TABLE IF NOT EXISTS ocorrencia_meio_pessoal (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_meio_id INTEGER NOT NULL REFERENCES ocorrencia_meios(id),
  pessoal_id INTEGER NOT NULL REFERENCES pessoal(id),
  chefe_viatura INTEGER NOT NULL DEFAULT 0, -- só o chefe pode marcar No Local/Em Regresso/Disponível desta viatura
  confirmado_em TEXT,
  escalado_timeout INTEGER NOT NULL DEFAULT 0
);

-- Timeline imutável (append-only) — nunca update/delete via aplicação
CREATE TABLE IF NOT EXISTS historico_estados (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  ocorrencia_meio_id INTEGER REFERENCES ocorrencia_meios(id),
  timestamp TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  tipo_evento TEXT NOT NULL,
  estado_anterior TEXT,
  estado_novo TEXT,
  autor_id INTEGER REFERENCES utilizadores(id), -- quem fez a ação (NULL = sistema)
  autor_label TEXT NOT NULL DEFAULT 'sistema', -- snapshot do nome, para histórico legível mesmo se o utilizador for desativado/apagado depois
  nota TEXT
);

-- Notas / pontos de situação — secção separada da timeline automática de
-- mudanças de estado (historico_estados). São texto livre, escrito pelo
-- operador ou pelo chefe de viatura, para registar contexto operacional
-- que não é capturado pelas transições de estado em si (ex: "fogo em duas
-- frentes", "a reabastecer água", "CODU a caminho"). Append-only, como o
-- histórico — nunca se edita ou apaga uma nota já registada.
-- ocorrencia_meio_id NULL = nota geral da ocorrência; preenchido = nota
-- específica daquela viatura ("ponto de situação" da viatura).
CREATE TABLE IF NOT EXISTS notas_ocorrencia (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  ocorrencia_meio_id INTEGER REFERENCES ocorrencia_meios(id),
  texto TEXT NOT NULL,
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema',
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

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);
CREATE INDEX IF NOT EXISTS idx_notas_ocorrencia ON notas_ocorrencia(ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_notas_meio ON notas_ocorrencia(ocorrencia_meio_id);

-- ============================================================
-- APROXIMAÇÃO AO SGO (Sistema de Gestão de Operações, ANEPC)
-- ============================================================
-- As tabelas abaixo aproximam o ACG aos Guias de Comando oficiais do
-- SGO (Fase I), preenchidos pelo COS DEPOIS de chegar ao local — por
-- isso vivem à parte da criação da ocorrência (que é só o registo do
-- alerta) e aparecem na ficha de detalhe, num botão "Reconhecimento".
-- Cada categoria/sub-tipo tem a SUA PRÓPRIA tabela porque os guias
-- oficiais têm campos completamente diferentes entre si (ex: incêndio
-- estrutural usa Hidrantes/Tipo de edifício; florestal usa
-- Combustível/Declive/Acessos) — uma tabela genérica única ficaria com
-- decenas de colunas maioritariamente vazias para qualquer ocorrência.
-- Todas ligam 1:1 com ocorrencias (UNIQUE em ocorrencia_id) e são
-- totalmente opcionais — a ocorrência funciona normalmente sem nenhuma
-- ficha de reconhecimento preenchida.

-- COS — Comandante da Ocorrência no local. Conceito SEPARADO do
-- operador que despacha da central (ocorrencias.operador_id): o COS só
-- existe fisicamente no local, é normalmente um elemento de uma das
-- viaturas despachadas, e PODE MUDAR ao longo da ocorrência ("Passagem
-- de COS", por isso esta tabela é histórico, não um campo único na
-- ocorrência. O COS atual é a linha com passou_em IS NULL.
CREATE TABLE IF NOT EXISTS ocorrencia_cos (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  pessoal_id INTEGER NOT NULL REFERENCES pessoal(id),
  categoria_cos TEXT, -- texto livre: "Comandante", "2º Comandante", "Chefe", etc — categoria/posto de quem assume, conforme o SGO pede ("Assumo COS | Categoria e Nome")
  assumido_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  passou_em TEXT, -- NULL enquanto for o COS atual
  passou_para_pessoal_id INTEGER REFERENCES pessoal(id), -- só para registo rápido; o novo COS tem sempre a sua própria linha nova nesta tabela também
  registado_por_id INTEGER REFERENCES utilizadores(id),
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

-- Pontos de Situação (POSIT) — snapshot textual datado e numerado
-- (2º POSIT, 3º POSIT...), distinto de notas_ocorrencia (que é texto
-- solto sem numeração) e de historico_estados (que regista MUDANÇAS DE
-- ESTADO, não a perceção do COS do momento). numero_posit calculado
-- automaticamente (1º, 2º, 3º... por ocorrência) na inserção.
CREATE TABLE IF NOT EXISTS pontos_situacao (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL REFERENCES ocorrencias(id),
  numero_posit INTEGER NOT NULL, -- 1, 2, 3... sequencial por ocorrência
  hora TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  texto TEXT NOT NULL,
  autor_id INTEGER REFERENCES utilizadores(id),
  autor_label TEXT NOT NULL DEFAULT 'sistema',
  criado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  UNIQUE(ocorrencia_id, numero_posit)
);

-- Ficha de reconhecimento — Acidentes (categoria='Acidente')
CREATE TABLE IF NOT EXISTS reconhecimento_acidente (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL UNIQUE REFERENCES ocorrencias(id),
  tipo_acidente TEXT, -- Despiste | Colisao | Outra
  tipo_acidente_detalhe TEXT, -- "Despiste de: ___" / "Colisão entre: ___" / texto da Outra
  via TEXT,
  km_sentido TEXT,
  vitimas_leves INTEGER DEFAULT 0,
  vitimas_graves INTEGER DEFAULT 0,
  vitimas_mortos INTEGER DEFAULT 0,
  vitimas_desaparecidos INTEGER DEFAULT 0,
  encarcerados_mecanico INTEGER NOT NULL DEFAULT 0, -- boolean (0/1)
  encarcerados_fisico_tipo1 INTEGER NOT NULL DEFAULT 0,
  encarcerados_fisico_tipo2 INTEGER NOT NULL DEFAULT 0,
  encarcerados_veiculos TEXT, -- texto livre: "Veículo 1, Veículo 2" — o papel previa até 3, mas texto livre cobre qualquer número
  via_cortada INTEGER NOT NULL DEFAULT 0,
  via_condicionada INTEGER NOT NULL DEFAULT 0,
  via_sentido_afetado TEXT,
  carga_veiculo_tipo TEXT,
  carga_veiculo_afetacao TEXT,
  meteo_vento_direcao TEXT,
  meteo_vento_velocidade_kmh REAL,
  meteo_temperatura_c REAL,
  meteo_humidade_pct REAL,
  faco_zonas_trabalho INTEGER NOT NULL DEFAULT 0,
  faco_abordagem_vitimas INTEGER NOT NULL DEFAULT 0,
  faco_estabilizacao INTEGER NOT NULL DEFAULT 0,
  faco_criacao_espaco INTEGER NOT NULL DEFAULT 0,
  peco_vmer INTEGER NOT NULL DEFAULT 0,
  peco_vsat_vsae INTEGER NOT NULL DEFAULT 0,
  peco_absc INTEGER NOT NULL DEFAULT 0,
  peco_outros TEXT,
  atualizado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  atualizado_por_id INTEGER REFERENCES utilizadores(id)
);

-- Ficha de reconhecimento — Incêndios Urbanos/Industriais
-- (categoria='Incendio', subtipo_incendio='Urbano')
CREATE TABLE IF NOT EXISTS reconhecimento_incendio_urbano (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL UNIQUE REFERENCES ocorrencias(id),
  estado_incendio TEXT, -- Ativo | Dominado | Rescaldo | Extinto
  com_fogo_a_vista INTEGER NOT NULL DEFAULT 0,
  local_tipo TEXT, -- Habitacao | Comercio | Industria | Outro
  local_tipo_outro TEXT,
  edificio_tipo TEXT, -- Unifamiliar | EdificioGrandeAltura | UtilidadePublica | HospLarEscola | MilitarSeguranca | Outro
  edificio_tipo_outro TEXT,
  propagacao_horizontal INTEGER NOT NULL DEFAULT 0,
  propagacao_vertical INTEGER NOT NULL DEFAULT 0,
  hidrantes_tipo TEXT, -- Marco | Outro
  pontos_sensiveis_habitacoes INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_industria INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_comercio INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_outro TEXT,
  faco_reconhecimento INTEGER NOT NULL DEFAULT 0,
  faco_salvamentos INTEGER NOT NULL DEFAULT 0,
  faco_estb_meios_acao INTEGER NOT NULL DEFAULT 0,
  faco_proteccao_exposicoes INTEGER NOT NULL DEFAULT 0,
  faco_estrategia_ofensiva INTEGER NOT NULL DEFAULT 0,
  faco_estrategia_defensiva INTEGER NOT NULL DEFAULT 0,
  faco_rescaldo INTEGER NOT NULL DEFAULT 0,
  faco_vigilancia INTEGER NOT NULL DEFAULT 0,
  peco_vuci_veci INTEGER NOT NULL DEFAULT 0,
  peco_vtt INTEGER NOT NULL DEFAULT 0,
  peco_ve_vp INTEGER NOT NULL DEFAULT 0,
  peco_absc_abtd_abtm INTEGER NOT NULL DEFAULT 0,
  peco_vmer INTEGER NOT NULL DEFAULT 0,
  peco_smpc INTEGER NOT NULL DEFAULT 0,
  peco_elemento_comando INTEGER NOT NULL DEFAULT 0,
  peco_outro TEXT,
  atualizado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  atualizado_por_id INTEGER REFERENCES utilizadores(id)
);

-- Ficha de reconhecimento — Incêndios Florestais
-- (categoria='Incendio', subtipo_incendio='Florestal')
CREATE TABLE IF NOT EXISTS reconhecimento_incendio_florestal (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL UNIQUE REFERENCES ocorrencias(id),
  estado_incendio TEXT, -- Ativo | Dominado | Rescaldo | Extinto
  intensidade TEXT, -- Fraca | Muita
  combustivel_pinhal INTEGER NOT NULL DEFAULT 0,
  combustivel_mato INTEGER NOT NULL DEFAULT 0,
  combustivel_eucaliptal INTEGER NOT NULL DEFAULT 0,
  combustivel_agricola INTEGER NOT NULL DEFAULT 0,
  combustivel_povoamento_misto INTEGER NOT NULL DEFAULT 0,
  propagacao_tipo TEXT, -- Superficie | Copas
  declive TEXT, -- Suave | Moderado | Acentuado | TerrenoPlano
  a_evoluir_para TEXT, -- ponto cardeal, texto livre
  acessos_bons INTEGER NOT NULL DEFAULT 0,
  acessos_dificeis INTEGER NOT NULL DEFAULT 0,
  acessos_sem_acessos INTEGER NOT NULL DEFAULT 0,
  acessos_estrada_asfaltada INTEGER NOT NULL DEFAULT 0,
  acessos_estradoes INTEGER NOT NULL DEFAULT 0,
  acessos_todo_terreno INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_habitacoes INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_industria INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_comercio INTEGER NOT NULL DEFAULT 0,
  pontos_sensiveis_outros TEXT,
  meteo_vento_direcao TEXT,
  meteo_vento_velocidade_kmh REAL,
  meteo_temperatura_c REAL,
  meteo_humidade_pct REAL,
  faco_ataque_cabeca INTEGER NOT NULL DEFAULT 0,
  faco_ataque_flancos TEXT, -- texto livre: qual(is) flanco(s)
  faco_rescaldo INTEGER NOT NULL DEFAULT 0,
  faco_defesa_ponto_sensivel INTEGER NOT NULL DEFAULT 0,
  peco_brigadas INTEGER DEFAULT 0,
  peco_grupos INTEGER DEFAULT 0,
  peco_meio_aereo INTEGER NOT NULL DEFAULT 0,
  peco_outros TEXT,
  atualizado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  atualizado_por_id INTEGER REFERENCES utilizadores(id)
);

-- Ficha de reconhecimento — Matérias Perigosas (categoria='MateriasPerigosas')
CREATE TABLE IF NOT EXISTS reconhecimento_materias_perigosas (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL UNIQUE REFERENCES ocorrencias(id),
  caracterizacao_local TEXT, -- ViaPublicaLinhaFerrea | Edificio
  km_sentido TEXT,
  edificio_tipo TEXT,
  tipo_terreno TEXT,
  tipo_vegetacao TEXT,
  numero_perigo TEXT,
  numero_onu TEXT,
  quantidade_estimada TEXT,
  descricao_visual TEXT,
  natureza_fuga INTEGER NOT NULL DEFAULT 0,
  natureza_derrame INTEGER NOT NULL DEFAULT 0,
  natureza_incendio INTEGER NOT NULL DEFAULT 0,
  natureza_explosao INTEGER NOT NULL DEFAULT 0,
  natureza_outro TEXT,
  materia_nao_identificada_suspeita_nrbq INTEGER NOT NULL DEFAULT 0,
  cheiro_tem TEXT, -- Sim | Nao
  cheiro_tipo TEXT,
  cor TEXT,
  origem TEXT,
  vitimas_numero INTEGER DEFAULT 0,
  vitimas_leves INTEGER DEFAULT 0,
  vitimas_graves INTEGER DEFAULT 0,
  vitimas_mortos INTEGER DEFAULT 0,
  sem_vitimas INTEGER NOT NULL DEFAULT 0,
  principais_sintomas TEXT,
  meteo_vento_direcao TEXT,
  meteo_intensidade TEXT, -- Fraca | Moderada | Forte
  meteo_velocidade_kmh REAL,
  meteo_temperatura_c REAL,
  meteo_estado_ceu TEXT,
  meteo_precipitacao TEXT, -- Sim | Nao
  autoridade_no_local TEXT, -- Sim | Nao
  autoridade_gnr INTEGER NOT NULL DEFAULT 0,
  autoridade_psp INTEGER NOT NULL DEFAULT 0,
  faixas_desobstruidas INTEGER NOT NULL DEFAULT 0,
  faixas_obstruidas_numero INTEGER, -- 1,2,3,4
  outros_meios_inem_vmer_siv INTEGER NOT NULL DEFAULT 0,
  outros_meios_rsb INTEGER NOT NULL DEFAULT 0,
  outros_meios_gips INTEGER NOT NULL DEFAULT 0,
  outros_meios_outros TEXT,
  faco_proteccao_exposicoes INTEGER NOT NULL DEFAULT 0,
  faco_desobstrucao_limpeza_via INTEGER NOT NULL DEFAULT 0,
  faco_delimitacao_zonas TEXT, -- texto livre: quente/morna/fria, corredores
  peco_vuci_vpma_vttu_vsat_absc TEXT, -- quantificado, texto livre
  peco_autoridade_gnr_psp INTEGER NOT NULL DEFAULT 0,
  peco_elemento_comando_pco INTEGER NOT NULL DEFAULT 0,
  peco_outros TEXT,
  atualizado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  atualizado_por_id INTEGER REFERENCES utilizadores(id)
);

-- Ficha de reconhecimento — Calamidade (categoria='Calamidade')
-- Sem guia direto no SGO oficial — campos genéricos próprios, decididos
-- com o utilizador (tipo, área afetada, pessoas desalojadas/em risco).
CREATE TABLE IF NOT EXISTS reconhecimento_calamidade (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ocorrencia_id INTEGER NOT NULL UNIQUE REFERENCES ocorrencias(id),
  tipo_calamidade TEXT, -- texto livre: Inundação, Sismo, Movimento de massa, etc.
  area_afetada_descricao TEXT,
  pessoas_desalojadas INTEGER DEFAULT 0,
  pessoas_em_risco INTEGER DEFAULT 0,
  infraestruturas_afetadas TEXT,
  meteo_condicoes TEXT,
  faco TEXT,
  peco TEXT,
  atualizado_em TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
  atualizado_por_id INTEGER REFERENCES utilizadores(id)
);

CREATE INDEX IF NOT EXISTS idx_cos_ocorrencia ON ocorrencia_cos(ocorrencia_id);
CREATE INDEX IF NOT EXISTS idx_posit_ocorrencia ON pontos_situacao(ocorrencia_id);

