/**
 * 表見出しの並べ替え状態（清掃詳細ログ・エラー一覧・施設マスタ共通）。
 * ★Prisma の `SortOrder` と名前がぶつからないよう `TableSortOrder`★（指示書BH §2-1）
 */

export type TableSortOrder = "asc" | "desc";

export type SortState<K extends string> = { key: K; order: TableSortOrder } | null;

export type NextSortOptions = {
  /** 別列／既定からその列を選んだときの1回目の向き（施設マスタは `"desc"`、両画面は `"asc"`） */
  first: TableSortOrder;
  /** 日付・検知時刻など asc ↔ 既定の2状態列 */
  twoState: boolean;
};

/**
 * 見出しクリックで次に送る並べ替え状態（指示書BH §1-3）
 *
 * - 普通の列: 既定/別列 → first → 反対向き → 既定
 * - 2状態列: 既定/別列 → asc → 既定（desc なし）
 */
export function nextSortState<K extends string>(
  current: SortState<K>,
  key: K,
  options: NextSortOptions
): SortState<K> {
  const { first, twoState } = options;

  if (current === null || current.key !== key) {
    return { key, order: twoState ? "asc" : first };
  }

  if (twoState) {
    return null;
  }

  if (current.order === first) {
    return { key, order: first === "asc" ? "desc" : "asc" };
  }

  return null;
}

/**
 * 見出しに出す向き（▲▼△）。`defaultKey` は既定順のとき ▼ を出す2状態列用（日付・検知時刻）
 */
export function displayOrder<K extends string>(
  state: SortState<K>,
  key: K,
  defaultKey?: K
): TableSortOrder | null {
  if (state === null) {
    return defaultKey !== undefined && key === defaultKey ? "desc" : null;
  }
  return state.key === key ? state.order : null;
}
