package com.zioinfo.kintex.tenant;

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

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

/**
 * 테넌트 마스터 매퍼 (V26 {@code tenant}) — 컨텍스트 해소 + 플랫폼 관리자 온보딩용.
 * <p>★ PG 소문자 폴딩 회피: Map 반환 카멜케이스 별칭은 반드시 {@code AS "camelCase"} 쌍따옴표.
 */
@Mapper
public interface TenantMapper {

    /** 컨텍스트 해소용 (id, domain, status) 전량 — 소규모 마스터(캐시 대상). */
    @Select("""
            SELECT id           AS "id",
                   domain       AS "domain",
                   status       AS "status"
            FROM tenant
            """)
    List<Map<String, Object>> findAllForResolve();

    /** 존재 여부(상태 무관) — 등록 API 중복 검사·해소 검증. */
    @Select("SELECT count(*) FROM tenant WHERE id = #{id}")
    long existsById(@Param("id") String id);

    /**
     * 관리자 테넌트 목록 — 행사/사용자 수 포함(프론트 SCR-A9 계약: code·name·domain·status·events·users).
     * code=id 로 매핑(불변 코드). 카운트는 tenant_id 상관 서브쿼리(1단계 핵심 테이블 기준).
     */
    @Select("""
            SELECT t.id                                                           AS "code",
                   t.name                                                         AS "name",
                   t.domain                                                       AS "domain",
                   t.status                                                       AS "status",
                   (SELECT count(*) FROM event e    WHERE e.tenant_id = t.id)     AS "events",
                   (SELECT count(*) FROM app_user u WHERE u.tenant_id = t.id)     AS "users",
                   to_char(t.created_at, 'YYYY-MM-DD') AS "createdAt"
            FROM tenant t
            ORDER BY t.created_at ASC, t.id ASC
            """)
    List<Map<String, Object>> findAdminList();

    /** 테넌트 등록(온보딩 1단계 — 마스터 생성). status 기본 onboarding. */
    @org.apache.ibatis.annotations.Insert("""
            INSERT INTO tenant (id, name, domain, status)
            VALUES (#{id}, #{name}, #{domain}, #{status})
            """)
    int insert(@Param("id") String id, @Param("name") String name,
               @Param("domain") String domain, @Param("status") String status);
}
