-- 125_follow_counts_triggers.sql
-- v0.10.0 F187: Denormalized follower/following counts in user_profiles
-- Triggers to update user_profiles.follower_count and following_count on follows insert/delete

-- Increment follower_count for followed user, following_count for follower
CREATE OR REPLACE FUNCTION increment_follow_counts()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE public.user_profiles
    SET follower_count = follower_count + 1
    WHERE user_id = NEW.followed_id;

    UPDATE public.user_profiles
    SET following_count = following_count + 1
    WHERE user_id = NEW.follower_id;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Decrement with floor at 0 to prevent negative counts
CREATE OR REPLACE FUNCTION decrement_follow_counts()
RETURNS TRIGGER AS $$
BEGIN
    UPDATE public.user_profiles
    SET follower_count = GREATEST(0, follower_count - 1)
    WHERE user_id = OLD.followed_id;

    UPDATE public.user_profiles
    SET following_count = GREATEST(0, following_count - 1)
    WHERE user_id = OLD.follower_id;

    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS trg_follows_insert_counts ON public.follows;
CREATE TRIGGER trg_follows_insert_counts
    AFTER INSERT ON public.follows
    FOR EACH ROW EXECUTE FUNCTION increment_follow_counts();

DROP TRIGGER IF EXISTS trg_follows_delete_counts ON public.follows;
CREATE TRIGGER trg_follows_delete_counts
    AFTER DELETE ON public.follows
    FOR EACH ROW EXECUTE FUNCTION decrement_follow_counts();

COMMENT ON FUNCTION increment_follow_counts() IS 'v0.10.0 F187: Update user_profiles counts on follow';
COMMENT ON FUNCTION decrement_follow_counts() IS 'v0.10.0 F187: Update user_profiles counts on unfollow';
