-- ==========================================================================
-- Agencia PSI — Migracao: Trigger agenda_eventos → notificacao WhatsApp (8.3)
-- ==========================================================================
-- Quando um agenda_evento muda de status (ex: agendado → cancelado), dispara
-- a edge send-session-status-notification que resolve template e envia
-- mensagem WhatsApp ao paciente.
--
-- Transicoes que disparam (controlado na propria edge via STATUS_TEMPLATE_MAP):
--   - cancelado      → cancelamento_sessao
--   - remarcado      → remarcacao_sessao
--   - confirmado     → confirmacao_sessao
--
-- O trigger nao bloqueia o UPDATE (pg_net e assincrono). Se a edge falhar,
-- o evento ja foi salvo — so a notificacao sera perdida.
--
-- Pre-requisito: settings app.settings.supabase_url e app.settings.service_role_key
-- configuradas (mesmas usadas pelo cron do heartbeat e SLA).
-- ==========================================================================

CREATE OR REPLACE FUNCTION public.fn_notify_agenda_status_change()
RETURNS TRIGGER
LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public
AS $$
DECLARE
    v_url TEXT;
    v_key TEXT;
BEGIN
    -- So dispara se status realmente mudou
    IF NEW.status IS NOT DISTINCT FROM OLD.status THEN
        RETURN NEW;
    END IF;

    -- So dispara pra status "interessantes". Outros sao silenciosamente ignorados
    -- (a edge tambem tem essa logica, mas economizamos chamada HTTP aqui)
    IF NEW.status NOT IN ('cancelado', 'remarcado', 'confirmado') THEN
        RETURN NEW;
    END IF;

    -- Precisa de paciente vinculado (senao nao tem telefone)
    IF NEW.patient_id IS NULL THEN
        RETURN NEW;
    END IF;

    -- Busca settings
    BEGIN
        v_url := current_setting('app.settings.supabase_url', true);
        v_key := current_setting('app.settings.service_role_key', true);
    EXCEPTION WHEN OTHERS THEN
        -- Settings nao configuradas — silencioso
        RETURN NEW;
    END;

    IF v_url IS NULL OR v_key IS NULL THEN
        RETURN NEW;
    END IF;

    -- Fire and forget (pg_net)
    PERFORM net.http_post(
        url := v_url || '/functions/v1/send-session-status-notification',
        headers := jsonb_build_object(
            'Authorization', 'Bearer ' || v_key,
            'Content-Type', 'application/json'
        ),
        body := jsonb_build_object(
            'event_id', NEW.id,
            'old_status', OLD.status,
            'new_status', NEW.status
        )
    );

    RETURN NEW;
END;
$$;

DROP TRIGGER IF EXISTS trg_agenda_status_notify ON public.agenda_eventos;
CREATE TRIGGER trg_agenda_status_notify
    AFTER UPDATE OF status ON public.agenda_eventos
    FOR EACH ROW
    EXECUTE FUNCTION public.fn_notify_agenda_status_change();

COMMENT ON FUNCTION public.fn_notify_agenda_status_change() IS
    'Dispara edge send-session-status-notification quando status de agenda_eventos muda. So pra status mapeados (cancelado/remarcado/confirmado). Nao bloqueia UPDATE.';
