// 목록 페이지네이션 공통 — 오프셋 기반(?page&size), 표준 응답 { items, total, page, size }

// 페이지 응답 형태
export interface PaginatedResult<T> {
  items: T[];
  total: number;
  page: number;
  size: number;
}

// 정규화된 페이지 파라미터(+ DB skip/take)
export interface PageParams {
  page: number;
  size: number;
  skip: number;
  take: number;
}

const DEFAULT_SIZE = 20;
const MAX_SIZE = 100;

// page/size 정규화(범위 보정) + skip/take 계산
export function resolvePage(page?: number, size?: number): PageParams {
  const p =
    Number.isFinite(page) && (page as number) > 0
      ? Math.floor(page as number)
      : 1;
  const s =
    Number.isFinite(size) && (size as number) > 0
      ? Math.min(Math.floor(size as number), MAX_SIZE)
      : DEFAULT_SIZE;
  return { page: p, size: s, skip: (p - 1) * s, take: s };
}

// items + total → 표준 페이지 응답
export function paginated<T>(
  items: T[],
  total: number,
  params: PageParams,
): PaginatedResult<T> {
  return { items, total, page: params.page, size: params.size };
}
