/*
 * M15 공사/장치 옥션 API 클라이언트 — 자체 모듈.
 * ★ 공유 api/endpoints.ts 를 수정하지 않기 위해 옥션 엔드포인트를 여기에 캡슐화한다.
 *   공용 client.ts 의 api(get/post) 만 재사용하여 JWT·에러 봉투 처리를 공유한다.
 * 실시간 순위: 현재 WebSocket 채널이 없어 폴링 계약으로 구현(refetchInterval).
 *   TODO(M5 WS 재사용): STOMP /topic/auction/{id} 브로드캐스트 도입 시 폴링 제거.
 */
import { api } from './client';
import type {
  AuctionDetail,
  AuctionSummary,
  AwardRequest,
  AwardResult,
  AwardView,
  BidRequest,
  BidResult,
  CreateAuctionRequest,
} from './auctionTypes';

/** 실시간 순위 폴링 주기(ms). WebSocket 도입 전 계약. */
export const AUCTION_POLL_MS = 15_000;

export const auctionApi = {
  /** GET /api/auctions — 옥션 목록(카드). */
  list: (params?: { eventId?: string; page?: number; size?: number }) => {
    const q = new URLSearchParams();
    if (params?.eventId) q.set('eventId', params.eventId);
    if (params?.page != null) q.set('page', String(params.page));
    if (params?.size != null) q.set('size', String(params.size));
    const qs = q.toString();
    return api.get<AuctionSummary[]>(`/api/auctions${qs ? `?${qs}` : ''}`);
  },

  /** POST /api/auctions — 옥션 개설(발주자). */
  create: (body: CreateAuctionRequest) => api.post<AuctionSummary>('/api/auctions', body),

  /** GET /api/auctions/{id} — 상세·봉인 순위. */
  detail: (id: string) => api.get<AuctionDetail>(`/api/auctions/${encodeURIComponent(id)}`),

  /** POST /api/auctions/{id}/bids — 응찰(견적서 제출). 서버가 소계/부가세/총액 재계산. */
  bid: (id: string, body: BidRequest) =>
    api.post<BidResult>(`/api/auctions/${encodeURIComponent(id)}/bids`, body),

  /** POST /api/auctions/{id}/close — 라운드 마감 처리(발주자). */
  close: (id: string) => api.post<AuctionSummary>(`/api/auctions/${encodeURIComponent(id)}/close`),

  /** GET /api/auctions/{id}/award-view — 마감 후 발주자 전용 견적 비교. */
  awardView: (id: string) => api.get<AwardView>(`/api/auctions/${encodeURIComponent(id)}/award-view`),

  /** POST /api/auctions/{id}/award — 낙찰(발주자·사유 필수). */
  award: (id: string, body: AwardRequest) =>
    api.post<AwardResult>(`/api/auctions/${encodeURIComponent(id)}/award`, body),
};

/** react-query 키 팩토리 — 옥션 도메인. */
export const auctionKeys = {
  all: ['auction'] as const,
  list: (eventId?: string) => ['auction', 'list', eventId ?? 'all'] as const,
  detail: (id: string) => ['auction', 'detail', id] as const,
  awardView: (id: string) => ['auction', 'awardView', id] as const,
};
