package com.zioinfo.kintex.auth.mapper;

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.Map;

/**
 * 사용자 알림 설정 매퍼(마이페이지 SCR-48). {@code user_notification_pref} 1행/사용자.
 * 미행 사용자는 서비스에서 서버 기본값으로 취급한다(별도 시드 없음). 민감 컬럼 없음.
 */
@Mapper
public interface NotificationPrefMapper {

    /** 사용자 알림 설정 조회. 없으면 null(서비스에서 기본값 대체). */
    @Select("""
            SELECT notify_deadline AS "notifyDeadline", notify_approval AS "notifyApproval",
                   notify_payment  AS "notifyPayment",  email_enabled   AS "emailEnabled"
            FROM user_notification_pref WHERE user_id = #{userId}
            """)
    Map<String, Object> find(@Param("userId") String userId);

    /** 알림 설정 upsert(멱등) — 본인만 호출됨(서비스에서 principal.userId 강제). */
    @Update("""
            INSERT INTO user_notification_pref
                (user_id, notify_deadline, notify_approval, notify_payment, email_enabled, updated_at)
            VALUES (#{userId}, #{notifyDeadline}, #{notifyApproval}, #{notifyPayment}, #{emailEnabled}, now())
            ON CONFLICT (user_id) DO UPDATE SET
                notify_deadline = EXCLUDED.notify_deadline,
                notify_approval = EXCLUDED.notify_approval,
                notify_payment  = EXCLUDED.notify_payment,
                email_enabled   = EXCLUDED.email_enabled,
                updated_at      = now()
            """)
    int upsert(@Param("userId") String userId,
               @Param("notifyDeadline") boolean notifyDeadline,
               @Param("notifyApproval") boolean notifyApproval,
               @Param("notifyPayment") boolean notifyPayment,
               @Param("emailEnabled") boolean emailEnabled);
}
