<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
  UserMapper — 인증·행사 멤버십 조회.
  보안(계약 §0-3): password_hash 는 findAuthByEmail 인증 검증 용도로만 반환하며 응답 DTO로 노출 금지.
                    다른 조회에는 절대 select 하지 않는다.
-->
<mapper namespace="com.zioinfo.kintex.auth.mapper.UserMapper">

    <!-- 이메일 → 인증행(userId, displayName, passwordHash, hallManager). 없으면 null. -->
    <select id="findAuthByEmail" resultType="map">
        SELECT id            AS "userId",
               display_name  AS "displayName",
               password_hash AS "passwordHash",
               hall_manager  AS "hallManager"
        FROM app_user
        WHERE email = #{email}
          AND status = 'ACTIVE'
    </select>

    <!-- 사용자의 행사별 역할 + 워크스페이스 카드 메타(행사명·기간·홀라벨·D-데이). -->
    <select id="findEventRoles" resultType="map">
        SELECT em.event_id                    AS "eventId",
               em.role_code                   AS "roleCode",
               e.name                         AS "eventName",
               e.start_date                   AS "startDate",
               e.end_date                     AS "endDate",
               h.label                        AS "hallLabel",
               (e.start_date - CURRENT_DATE)  AS "dday"
        FROM event_member em
        JOIN event e ON e.id = em.event_id
        LEFT JOIN hall_assignment ha ON ha.event_id = e.id AND ha.is_primary = true
        LEFT JOIN hall h ON h.id = ha.hall_id
        WHERE em.user_id = #{userId}
        ORDER BY e.start_date
    </select>

    <!-- 사업자등록번호 → 등록업체 여부(CONTRACTOR 초대 게이트). 없으면 null. read-only. -->
    <select id="findCompanyRegistered" resultType="boolean">
        SELECT registered
        FROM company
        WHERE registration_no = #{registrationNo}
    </select>

    <!-- 내정보 표시용 프로필(민감 컬럼 제외). photo_path 존재 여부만 boolean 으로 노출. -->
    <select id="findProfile" resultType="map">
        SELECT id                          AS "userId",
               email                       AS "email",
               display_name                AS "displayName",
               phone                       AS "phone",
               dept_id                     AS "deptId",
               (photo_path IS NOT NULL)    AS "hasPhoto"
        FROM app_user
        WHERE id = #{userId}
    </select>

    <!-- 프로필 사진 메타(파일명·MIME) — 서빙 시 파일 로드용. 파일명은 서버 UUID(경로 순회 불가). -->
    <select id="findPhotoMeta" resultType="map">
        SELECT photo_path         AS "photoPath",
               photo_content_type AS "photoContentType"
        FROM app_user
        WHERE id = #{userId}
          AND photo_path IS NOT NULL
    </select>

    <!-- 프로필 사진 메타 갱신(본인만) — updated_at·photo_updated_at 동시 갱신. -->
    <update id="updatePhoto">
        UPDATE app_user
           SET photo_path         = #{photoPath},
               photo_content_type = #{photoContentType},
               photo_updated_at   = now(),
               updated_at         = now()
         WHERE id = #{userId}
    </update>

    <!-- 프로필 수정(본인만) — 화이트리스트 컬럼만. 빈 phone 은 NULL 저장(연락처 삭제). -->
    <update id="updateProfile">
        UPDATE app_user
           SET display_name = #{displayName},
               phone        = #{phone},
               updated_at   = now()
         WHERE id = #{userId}
    </update>

    <!-- 비밀번호 검증용 해시 조회(현재 비밀번호 대조 전용) — 응답 노출 금지. -->
    <select id="findPasswordHash" resultType="string">
        SELECT password_hash
        FROM app_user
        WHERE id = #{userId}
          AND status = 'ACTIVE'
    </select>

    <!-- 비밀번호 해시 갱신(본인 변경) — 서비스에서 현재 비밀번호 검증 후에만 호출. -->
    <update id="updatePassword">
        UPDATE app_user
           SET password_hash = #{passwordHash},
               updated_at    = now()
         WHERE id = #{userId}
    </update>

</mapper>
