/*
 * ReRoomAI 방식 사진 시안(image-to-image) API — SCR-06 "사진 시안" 섹션 전용(격리 파일).
 * 소유자 지시 13.2. 근거: docs/analysis/reroomai-source.md §4~5(보존/교체 프롬프트·1024px 다운스케일).
 *
 * ★ endpoints.ts/types.ts 를 건드리지 않기 위해 화면 폴더에 독립 클라이언트로 둔다.
 *   상태 폴링은 기존 RenderJob 상태 엔드포인트(GET /render-jobs/{jobId})를 그대로 재사용.
 */
import { api } from '../../api/client';
import type { RenderJobDto } from '../../api/types';

export interface ReferenceImage {
  referenceId: string;
  url: string;
}

export interface ReRoomStyle {
  id: string;
  label: string;
  swatch: [string, string, string];
}

/** ReRoom 스타일 카드 — 워커 prompts/reroom_styles.json 키와 정합(라벨은 한국어 하드코딩, 이 화면 컨벤션). */
export const REROOM_STYLES: ReRoomStyle[] = [
  { id: 'modern', label: '모던', swatch: ['#2b2b2e', '#8a8f98', '#f2f2f0'] },
  { id: 'minimal', label: '미니멀', swatch: ['#ffffff', '#d8d8d8', '#333333'] },
  { id: 'tech', label: '테크', swatch: ['#0a0e27', '#00d4ff', '#e6f7ff'] },
  { id: 'luxury', label: '럭셔리', swatch: ['#1a1a1a', '#c9a24b', '#f4f1ea'] },
  { id: 'korean_traditional', label: '한국 전통', swatch: ['#8a5a2b', '#c8b18a', '#2f3b30'] },
  { id: 'eco', label: '친환경', swatch: ['#2f4f3e', '#a8c686', '#f2efe6'] },
];

const base = (eventId: string, boothId: string) =>
  `/api/events/${encodeURIComponent(eventId)}/booths/${encodeURIComponent(boothId)}/reroom`;

export const reroomApi = {
  /** 참조 이미지 업로드(multipart file) → {referenceId, url}. */
  uploadReference: (eventId: string, boothId: string, file: Blob) => {
    const form = new FormData();
    form.append('file', file, 'reference.jpg');
    return api.postForm<ReferenceImage>(`${base(eventId, boothId)}/reference`, form);
  },
  /** 사진 시안 렌더 발행 → RenderJobDto(QUEUED). */
  render: (
    eventId: string,
    boothId: string,
    body: { referenceId: string; style: string; instruction?: string },
  ) => api.post<RenderJobDto>(`${base(eventId, boothId)}/render`, body),
  /** 상태 폴링(기존 RenderJob 상태 엔드포인트 재사용). */
  status: (eventId: string, jobId: string) =>
    api.get<RenderJobDto>(
      `/api/events/${encodeURIComponent(eventId)}/render-jobs/${encodeURIComponent(jobId)}`,
    ),
};

/**
 * G-09 부스 렌더 이력 — 완료(DONE) 렌더잡의 영속 갤러리(백엔드 render_job 테이블).
 * endpoints.ts 무수정 원칙에 따라 화면 폴더 클라이언트로 둔다.
 *   GET /api/events/{eventId}/booths/{boothId}/render-history → RenderJobDto[](최신순)
 */
export const renderHistoryApi = {
  list: (eventId: string, boothId: string) =>
    api.get<RenderJobDto[]>(
      `/api/events/${encodeURIComponent(eventId)}/booths/${encodeURIComponent(boothId)}/render-history`,
    ),
};

/**
 * 클라이언트 다운스케일(ReRoomAI Studio.handleImageFile 등가) — 긴 쪽 1024px, JPEG 0.85.
 * 전송량·모델 비용·응답시간 동시 절감. 실패 시 원본 Blob 반환(방어).
 */
export const MAX_SIDE = 1024;
export const JPEG_QUALITY = 0.85;
export const MAX_UPLOAD_BYTES = 10 * 1024 * 1024;

export function downscaleImage(file: File): Promise<Blob> {
  return new Promise((resolve) => {
    const url = URL.createObjectURL(file);
    const img = new Image();
    img.onload = () => {
      URL.revokeObjectURL(url);
      const longSide = Math.max(img.width, img.height);
      const scale = longSide > MAX_SIDE ? MAX_SIDE / longSide : 1;
      const w = Math.max(1, Math.round(img.width * scale));
      const h = Math.max(1, Math.round(img.height * scale));
      const canvas = document.createElement('canvas');
      canvas.width = w;
      canvas.height = h;
      const ctx = canvas.getContext('2d');
      if (!ctx) {
        resolve(file);
        return;
      }
      ctx.drawImage(img, 0, 0, w, h);
      canvas.toBlob(
        (blob) => resolve(blob ?? file),
        'image/jpeg',
        JPEG_QUALITY,
      );
    };
    img.onerror = () => {
      URL.revokeObjectURL(url);
      resolve(file);
    };
    img.src = url;
  });
}
