CREATE OR REPLACE FUNCTION public.fn_admin_upsert_promotion_reason(p_data jsonb)
 RETURNS jsonb
 LANGUAGE plpgsql
AS $function$
DECLARE
    v_id    int         := (p_data->>'reason_id')::int;
    v_label text        := trim(p_data->>'label');
    v_order int         := COALESCE((p_data->>'sort_order')::int, 0);
    v_lang  varchar(5)  := COALESCE(NULLIF(trim(p_data->>'lang'), ''), 'es');
BEGIN
    IF v_label IS NULL OR v_label = '' THEN
        RETURN jsonb_build_object('error', 'El campo label es obligatorio.');
    END IF;

    IF v_id IS NOT NULL THEN
        UPDATE public.promotion_reasons
        SET label = v_label, sort_order = v_order, lang = v_lang
        WHERE reason_id = v_id;

        IF NOT FOUND THEN
            RETURN jsonb_build_object('error', 'Motivo no encontrado.');
        END IF;
        RETURN jsonb_build_object('success', true, 'reason_id', v_id);
    ELSE
        INSERT INTO public.promotion_reasons (label, sort_order, lang)
        VALUES (v_label, v_order, v_lang)
        RETURNING reason_id INTO v_id;

        RETURN jsonb_build_object('success', true, 'reason_id', v_id);
    END IF;
END;
$function$
;
