-- +goose Up
-- +goose StatementBegin
ALTER TABLE etapas_producao
  DROP CONSTRAINT IF EXISTS etapas_producao_status_check;
-- +goose StatementEnd

-- +goose StatementBegin
ALTER TABLE etapas_producao
  ADD CONSTRAINT etapas_producao_status_check
  CHECK (status IN ('pendente','em_andamento','concluido','pulado'));
-- +goose StatementEnd

-- +goose StatementBegin
CREATE INDEX IF NOT EXISTS idx_etapas_responsavel_ativo
  ON etapas_producao (tenant_id, responsavel_id, status)
  WHERE status = 'em_andamento';
-- +goose StatementEnd

-- +goose StatementBegin
CREATE INDEX IF NOT EXISTS idx_registros_ponto_func_hoje
  ON registros_ponto (tenant_id, funcionario_id, criado_em DESC);
-- +goose StatementEnd

-- +goose StatementBegin
CREATE OR REPLACE VIEW v_operadores_jornada_ativa AS
SELECT
  u.id           AS user_id,
  u.tenant_id,
  u.nome,
  COALESCE(u.cargo, u.role) AS cargo,
  u.role,
  last_reg.tipo  AS ultimo_tipo_ponto,
  last_reg.ts    AS ultima_batida
FROM users u
JOIN LATERAL (
  SELECT rp.tipo, rp.criado_em AS ts
  FROM   registros_ponto rp
  WHERE  rp.funcionario_id = u.id
    AND  rp.tenant_id      = u.tenant_id
    AND  (rp.criado_em AT TIME ZONE 'America/Sao_Paulo')::date
         = (NOW() AT TIME ZONE 'America/Sao_Paulo')::date
  ORDER  BY rp.criado_em DESC
  LIMIT  1
) last_reg ON true
WHERE  u.ativo = true
  AND  last_reg.tipo IN ('entrada', 'intervalo_ini', 'intervalo_fim');
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DROP VIEW IF EXISTS v_operadores_jornada_ativa;
-- +goose StatementEnd

-- +goose StatementBegin
DROP INDEX IF EXISTS idx_etapas_responsavel_ativo;
-- +goose StatementEnd

-- +goose StatementBegin
DROP INDEX IF EXISTS idx_registros_ponto_func_hoje;
-- +goose StatementEnd

-- +goose StatementBegin
ALTER TABLE etapas_producao
  DROP CONSTRAINT IF EXISTS etapas_producao_status_check;
-- +goose StatementEnd

-- +goose StatementBegin
ALTER TABLE etapas_producao
  ADD CONSTRAINT etapas_producao_status_check
  CHECK (status IN ('pendente','em_andamento','concluido'));
-- +goose StatementEnd
