package com.zioinfo.kintex.auth.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.OffsetDateTime;
import java.util.Map;

/**
 * 공개 인증(회원가입·비밀번호 재설정) 영속 매퍼.
 * <p>기존 {@link UserMapper}/보안 매퍼는 교체하지 않고 순증한다. 보안 불변(계약 §0-3):
 * password_hash·code_hash 는 저장/검증 경로에서만 다루며 응답 DTO·로그로 노출 금지.
 */
@Mapper
public interface PublicAuthMapper {

    /** 이메일 중복 확인(대소문자 무시 정규화된 값 기준). 존재하면 1, 없으면 null. */
    Integer countByEmail(@Param("email") String email);

    /** 신규 사용자 삽입(role_code='USER', status='ACTIVE', verify_method='EMAIL'). */
    int insertUser(@Param("id") String id,
                   @Param("email") String email,
                   @Param("displayName") String displayName,
                   @Param("passwordHash") String passwordHash,
                   @Param("companyName") String companyName);

    /** inviteCode 를 행사 식별자로 해석 — 존재하는 활성 행사면 eventId 반환, 없으면 null(best-effort). */
    String findEventIdByInvite(@Param("code") String code);

    /** 초대 매핑 — event_member 삽입(EXHIBITOR). 중복이면 무시. */
    int insertEventMember(@Param("id") String id,
                          @Param("eventId") String eventId,
                          @Param("userId") String userId);

    /** 활성 사용자 존재 시 userId 반환(비밀번호 찾기 — 존재 여부는 응답에 노출 안 함). 없으면 null. */
    String findActiveUserIdByEmail(@Param("email") String email);

    /** 재설정 코드 저장(만료·1회성). code_hash 는 BCrypt. */
    int insertResetCode(@Param("email") String email,
                        @Param("codeHash") String codeHash,
                        @Param("expiresAt") OffsetDateTime expiresAt);

    /** 이메일의 최신 미사용 재설정 행(id, codeHash, expiresAt, attempts). 없으면 null. */
    Map<String, Object> findLatestActiveReset(@Param("email") String email);

    /** 재설정 코드 1회성 소진. */
    int markResetUsed(@Param("id") long id);

    /** 재설정 코드 검증 실패 누적(시도제한). */
    int incrementResetAttempts(@Param("id") long id);

    /** 비밀번호 갱신 + 로그인 실패 카운트/잠금 해제(재설정 성공). */
    int updatePasswordByEmail(@Param("email") String email, @Param("passwordHash") String passwordHash);
}
