-- Phase 5: 추천 크리에이터 동시 팔로우 중복 방지 운영 DB 반영 SQL
-- 목적: creator_following 테이블의 동일 회원/크리에이터 중복 row를 정리하고 유니크 제약을 추가한다.
-- 주의: 운영 반영 전 아래 중복 조회 결과를 검토하고, 삭제 대상 row가 운영 정책상 보존 대상인지 확인한다.

-- 1. 중복 데이터 사전 점검
select
    member_id,
    creator_id,
    count(*) as duplicate_count,
    group_concat(id order by id asc) as duplicate_ids
from creator_following
group by member_id, creator_id
having count(*) > 1;

-- 2. 중복 row 정리
-- 동일 member_id/creator_id 조합에서 가장 작은 id 1개만 유지한다.
-- 유지 row는 중복 row 중 하나라도 활성 상태였으면 활성 상태로 보정한다.
update creator_following keep_cf
join (
    select
        member_id,
        creator_id,
        min(id) as keep_id,
        max(case when is_active = true then 1 else 0 end) as any_active,
        max(case when is_notify = true then 1 else 0 end) as any_notify
    from creator_following
    group by member_id, creator_id
    having count(*) > 1
) duplicate_cf on keep_cf.id = duplicate_cf.keep_id
set
    keep_cf.is_active = duplicate_cf.any_active = 1,
    keep_cf.is_notify = duplicate_cf.any_notify = 1;

delete duplicate_cf
from creator_following duplicate_cf
join (
    select
        member_id,
        creator_id,
        min(id) as keep_id
    from creator_following
    group by member_id, creator_id
    having count(*) > 1
) keep_cf on duplicate_cf.member_id = keep_cf.member_id
    and duplicate_cf.creator_id = keep_cf.creator_id
    and duplicate_cf.id <> keep_cf.keep_id;

-- 3. 중복 정리 결과 재확인: 결과가 없어야 한다.
select
    member_id,
    creator_id,
    count(*) as duplicate_count,
    group_concat(id order by id asc) as duplicate_ids
from creator_following
group by member_id, creator_id
having count(*) > 1;

-- 4. 유니크 제약 추가
alter table creator_following
    add constraint uk_creator_following_member_creator unique (member_id, creator_id);
