package com.zioinfo.kintex.webhook.automation;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * F052 리드 팔로업 EDM 자동 트리거 매퍼.
 * <p>visitor {@code lead} 테이블은 <b>읽기만</b>, marketing {@code edm_campaign} 테이블은 <b>insert 만</b>(패키지 파일 미수정).
 * 멱등 로그 {@code edm_followup_log} 만 본 모듈이 소유한다.
 */
@Mapper
public interface FollowupMapper {

    /**
     * 아직 팔로업 로그가 없는 hot 리드(score &gt;= 80)를 조회. (LEFT JOIN NULL 로 미처리분만 · 재스윕 중복 방지)
     * PII(name/phone/email) 는 SELECT 하지 않는다 — company/product/followup_draft 만(본문 초안 재사용).
     */
    @Select("""
            SELECT l.id AS "leadId", l.event_id AS "eventId", l.company AS "company",
                   l.product AS "product", l.score AS "score", l.followup_draft AS "bodyDraft"
            FROM lead l
            LEFT JOIN edm_followup_log f
              ON f.event_id = l.event_id AND f.lead_id = l.id
            WHERE l.score >= 80 AND f.id IS NULL
            ORDER BY l.score DESC, l.id
            LIMIT #{limit}
            """)
    List<Map<String, Object>> findUnprocessedHotLeads(@Param("limit") int limit);

    /**
     * 멱등 로그 예약 — {@code UNIQUE(event_id, lead_id)} 충돌 시 미삽입(0 반환).
     * 1 반환 시에만 캠페인 초안 생성(중복 생성 차단 핵심).
     */
    @Insert("""
            INSERT INTO edm_followup_log (tenant_id, id, event_id, lead_id, hot_score, body_draft)
            VALUES ('KINTEX', #{id}, #{eventId}, #{leadId}, #{score}, #{bodyDraft})
            ON CONFLICT (event_id, lead_id) DO NOTHING
            """)
    int reserveFollowup(@Param("id") String id,
                        @Param("eventId") String eventId,
                        @Param("leadId") String leadId,
                        @Param("score") int score,
                        @Param("bodyDraft") String bodyDraft);

    /** marketing edm_campaign 에 draft 캠페인 1건 insert(발송 없음 · 기존 컬럼만 사용). */
    @Insert("""
            INSERT INTO edm_campaign (id, event_id, name, status, audience, meta, open_rate, click_rate)
            VALUES (#{id}, #{eventId}, #{name}, 'draft', 1, #{meta}, '-', '-')
            """)
    int insertFollowupCampaign(@Param("id") String id,
                               @Param("eventId") String eventId,
                               @Param("name") String name,
                               @Param("meta") String meta);

    @Update("""
            UPDATE edm_followup_log SET campaign_id = #{campaignId}
            WHERE tenant_id = 'KINTEX' AND id = #{id}
            """)
    int linkCampaign(@Param("id") String id, @Param("campaignId") String campaignId);
}
