/*
 * 공개 홍보 사이트(M12) 로컬 API 클라이언트 — 전 경로 비인증 공개.
 * 공용 client 의 anonymous 옵션만 사용(client.ts 미수정). 응답은 ApiResponse.data 로 언랩됨.
 * 근거: kintex-backend-dev com.zioinfo.kintex.publicsite + _workspace/port_public.md G1~G6.
 */
import { api } from '../../api/client';

// ── 공개 카탈로그 shape (백엔드 PublicEventDto) ──────────────────────────────
export interface PublicEvent {
  id: string;
  name: string;
  startDate: string | null;
  endDate: string | null;
  status: string | null;
  hallLabel: string | null;
  boothCount: number | null;
  /** V46: 빌드 내장 로컬 포스터 경로(/media/posters/*.jpg). 부재 시 그라디언트 폴백. */
  posterUrl?: string | null;
}

export interface PublicFloorplanHall {
  hallId: string;
  label: string;
  center: number | null;
  primary: boolean;
}

export interface PublicFloorplanBooth {
  boothNo: string | null;
  companyName: string | null;
  boothType: string | null;
  status: 'available' | 'reserved' | string;
  cx: number | null;
  cy: number | null;
  hallLabel: string | null;
}

export interface PublicFloorplan {
  eventId: string;
  eventName: string;
  halls: PublicFloorplanHall[];
  booths: PublicFloorplanBooth[];
}

// ── 공개 공지 (M17 CMS · GET /api/public/cms/NOTICE — 게시분만) ──────────────
export interface PublicNotice {
  id: string;
  title: string;
  body?: string | null;
  publishedAt?: string | null;
  createdAt?: string | null;
}

// ── 관람 안내 · AI 도우미 (백엔드 PublicGuideDtos / VisitorAssistantDtos, V43 라이브) ──
/** 연/월 캘린더 행사 카드 (v_event_calendar). lifecycle ∈ UPCOMING|ONGOING|ENDED|UNKNOWN. */
export interface PublicCalendarEvent {
  id: string;
  name: string;
  category: string | null;
  hallLabel: string | null;
  posterUrl: string | null;
  startDate: string | null;
  endDate: string | null;
  eventYear: number | null;
  eventMonth: number | null;
  lifecycle: string | null;
}

/** 월별 전시 건수 요약 (v_event_monthly_summary) — 연간 기획 요약 근거. */
export interface MonthlySummary {
  eventYear: number | null;
  eventMonth: number | null;
  eventCount: number | null;
}

/** 관람객 방문가이드 항목 (visitor_guide). */
export interface VisitorGuide {
  id: string;
  category: string | null;
  title: string | null;
  body: string | null;
  summary: string | null;
  displayOrder: number | null;
  sourceUrl: string | null;
}

/** 교통수단 구조화 항목 (transport_info). */
export interface TransportInfo {
  id: string;
  mode: string | null;
  lineName: string | null;
  route: string | null;
  fromPoint: string | null;
  travelTime: string | null;
  note: string | null;
  displayOrder: number | null;
  sourceUrl: string | null;
}

/** AI 관람 도우미 인용 출처 — type ∈ EVENT|TRANSPORT|GUIDE. */
export interface AssistantCitation {
  type: string;
  id: string;
  title: string;
  sourceUrl: string | null;
}

/**
 * AI 관람 도우미 응답 (POST /api/public/ai/visitor-assistant).
 * grounded=false → DB 근거를 못 찾음(정직한 "찾지 못함"). provider ∈ claude|ollama|search|none.
 */
export interface AssistantResult {
  question: string;
  answer: string;
  events: PublicCalendarEvent[];
  transport: TransportInfo[];
  guide: VisitorGuide[];
  citations: AssistantCitation[];
  grounded: boolean;
  provider: string;
  degraded: boolean;
}

// ── 문의 접수 (백엔드 InquiryRequest / InquiryReceiptDto) ────────────────────
export interface InquiryPayload {
  inquiryType?: string;
  company?: string;
  contactName?: string;
  email?: string;
  phone?: string;
  scale?: string;
  hallPref?: string;
  message?: string;
  agreePrivacy: boolean;
  agreeMarketing?: boolean;
}

export interface InquiryReceipt {
  receiptNo: string;
  status: string;
}

// ── 관람객 사전등록 (visitor 팀 구현 중 — 계약만 전제) ──────────────────────
export interface RegistrationPayload {
  name: string;
  phone: string;
  email: string;
  visitorType: string;
  agreePrivacy: boolean;
  agreeMarketing?: boolean;
}

export interface RegistrationReceipt {
  registrationId: string;
  badgeCode: string;
}

// ── 참가업체 마이크로사이트 (cms 팀 계약 — 관용적 옵셔널) ────────────────────
export interface PublicMicrosite {
  exhibitorId?: string;
  brandName?: string;
  tagline?: string;
  boothNo?: string;
  hallLabel?: string;
  products?: Array<{ tag?: string; title?: string; description?: string }>;
  renderShots?: Array<{ label?: string; imageUrl?: string }>;
  [key: string]: unknown;
}

const opt = { anonymous: true } as const;

function qs(params: Record<string, string | undefined>): string {
  const sp = new URLSearchParams();
  Object.entries(params).forEach(([k, v]) => {
    if (v != null && v !== '') sp.set(k, v);
  });
  const s = sp.toString();
  return s ? `?${s}` : '';
}

export const publicApi = {
  listEvents: (year?: string, q?: string) =>
    api.get<PublicEvent[]>(`/api/public/events${qs({ year, q })}`, opt),

  getEvent: (eventId: string) =>
    api.get<PublicEvent>(`/api/public/events/${encodeURIComponent(eventId)}`, opt),

  getFloorplan: (eventId: string) =>
    api.get<PublicFloorplan>(`/api/public/events/${encodeURIComponent(eventId)}/floorplan`, opt),

  submitInquiry: (payload: InquiryPayload) =>
    api.post<InquiryReceipt>('/api/public/inquiries', payload, opt),

  /** visitor 팀 계약 — 백엔드 미배포 시 에러(3상태 토스트로 처리). */
  register: (eventId: string, payload: RegistrationPayload) =>
    api.post<RegistrationReceipt>(
      `/api/public/events/${encodeURIComponent(eventId)}/register`,
      payload,
      opt,
    ),

  /** cms 팀 계약 — shape 확정 전 관용 처리. */
  getMicrosite: (exhibitorId: string) =>
    api.get<PublicMicrosite>(`/api/public/microsites/${encodeURIComponent(exhibitorId)}`, opt),

  /** M17 공개 공지(게시분) — 최근순. 백엔드 미배포 시 에러(빈/안내로 처리). */
  listNotices: (limit = 5) =>
    api.get<PublicNotice[]>(`/api/public/cms/NOTICE${qs({ limit: String(limit) })}`, opt),

  // ── 관람 안내 · AI 도우미 (V43 라이브) ──────────────────────────────────────
  /** AI 관람 도우미 — 자연어 질문을 크롤 적재 DB 근거로 답변(비인증). */
  askVisitorAssistant: (question: string) =>
    api.post<AssistantResult>('/api/public/ai/visitor-assistant', { question }, opt),

  /** 연/월/상태 캘린더(v_event_calendar). lifecycle ∈ UPCOMING|ONGOING|ENDED. */
  listCalendar: (params: { year?: number; month?: number; lifecycle?: string; limit?: number } = {}) =>
    api.get<PublicCalendarEvent[]>(
      `/api/public/events/calendar${qs({
        year: params.year != null ? String(params.year) : undefined,
        month: params.month != null ? String(params.month) : undefined,
        lifecycle: params.lifecycle,
        limit: params.limit != null ? String(params.limit) : undefined,
      })}`,
      opt,
    ),

  /** 월별 전시 건수 집계(v_event_monthly_summary) — 연간 기획 요약. */
  listMonthlySummary: (year?: number) =>
    api.get<MonthlySummary[]>(
      `/api/public/events/monthly-summary${qs({ year: year != null ? String(year) : undefined })}`,
      opt,
    ),

  /** 방문가이드(교통/주차/입장/편의/접근성/개요). */
  listVisitorGuide: (category?: string) =>
    api.get<VisitorGuide[]>(`/api/public/visitor-guide${qs({ category })}`, opt),

  /** 교통수단 구조화(SUBWAY/GTX/BUS/CAR/AIRPORT/KTX). */
  listTransport: (mode?: string) =>
    api.get<TransportInfo[]>(`/api/public/transport${qs({ mode })}`, opt),
};
