import { useEffect, useState, type ChangeEvent } from 'react';
import { api, getAccessToken, setAccessToken } from '../../api/client';
import { useIsAdmin } from '../../screens/admin/AdminGuard';

/**
 * 테넌트(전시관) 스위처 — 플랫폼 관리자 전용 헤더 드롭다운(멀티테넌시 2단계 · §1A-3-2).
 * 선택 시 백엔드가 대상 테넌트 tid 가 박힌 신규 토큰을 재발급(POST /api/admin/tenants/{code}/switch)하고,
 * 세션 토큰을 교체 후 전 화면을 새 테넌트 컨텍스트로 재조회한다(reload). 테넌트가 1개면 표시하지 않는다.
 *
 * 소유권: components/layout 신규 컴포넌트 — client.ts(토큰 저장) 유틸만 재사용(수정 아님).
 * 문자열은 인라인 ko(i18n JSON 은 병렬 스윕 소유).
 */
interface TenantRow {
  code: string;
  name: string;
  status: string;
}
interface SwitchResponse {
  accessToken: string;
  expiresIn: number;
  tenant: string;
}

/** 현재 세션 토큰의 tid 클레임(대문자). 파싱 실패·부재 시 기준 테넌트 KINTEX. */
function currentTid(): string {
  const tok = getAccessToken();
  if (!tok) return 'KINTEX';
  try {
    const seg = tok.split('.')[1];
    const json = atob(seg.replace(/-/g, '+').replace(/_/g, '/'));
    const payload = JSON.parse(json) as { tid?: string };
    return String(payload.tid ?? 'KINTEX').toUpperCase();
  } catch {
    return 'KINTEX';
  }
}

export function TenantSwitcher() {
  const isAdmin = useIsAdmin();
  const [tenants, setTenants] = useState<TenantRow[]>([]);
  const [current] = useState<string>(() => currentTid());
  const [busy, setBusy] = useState(false);

  useEffect(() => {
    if (!isAdmin) return;
    let cancelled = false;
    api
      .get<TenantRow[]>('/api/admin/tenants')
      .then((rows) => {
        if (!cancelled) setTenants(rows ?? []);
      })
      .catch(() => {
        /* 목록 조회 실패 시 스위처 미표시 — 조용히 무시 */
      });
    return () => {
      cancelled = true;
    };
  }, [isAdmin]);

  // 관리자가 아니거나 전환할 테넌트가 1개뿐이면 노출하지 않는다(클러터 방지).
  if (!isAdmin || tenants.length < 2) return null;

  const onChange = async (e: ChangeEvent<HTMLSelectElement>) => {
    const code = e.target.value;
    if (!code || code.toUpperCase() === current || busy) return;
    setBusy(true);
    try {
      const res = await api.post<SwitchResponse>(
        `/api/admin/tenants/${encodeURIComponent(code)}/switch`,
      );
      setAccessToken(res.accessToken);
      window.location.reload(); // 전 화면을 새 테넌트 컨텍스트로 재조회
    } catch {
      setBusy(false); // 실패 시 선택 원복
    }
  };

  return (
    <label className="kx-tenant-switcher" title="전시관(테넌트) 전환">
      <span className="kx-tenant-switcher__label">전시관</span>
      <select
        className="kx-tenant-switcher__select"
        value={current}
        onChange={onChange}
        disabled={busy}
        aria-label="전시관 전환"
      >
        {tenants.map((t) => (
          <option key={t.code} value={t.code}>
            {t.name} ({t.code})
          </option>
        ))}
      </select>
    </label>
  );
}
