/**
 * useFileView — ファイル窓の表示モード（アイコン/詳細）と並べ替え状態を管理するフック。
 *
 * - 表示モードと並べ替え状態の両方を localStorage に記憶し、タスク窓・ワークスペース窓で
 *   共通の好みにする（リロードしても維持。不正な保存値は既定にフォールバック）。
 * - ソートそのものは lib/fileView.ts の純関数に委譲する。
 *
 * タスク（FileBrowser）とワークスペース（SpaceDetail）の両方から使う。
 */
import { useCallback, useMemo, useState } from 'react';
import type { LocalFileEntry } from '../api';
import {
  type FileViewMode,
  type FileSortKey,
  type FileSortState,
  type FileSortDir,
  DEFAULT_FILE_SORT,
  nextSort,
  sortFileEntries,
} from '../lib/fileView';

const MODE_KEY = 'maestro.fileView.mode';
const SORT_KEY = 'maestro.fileView.sort';

function readStoredMode(): FileViewMode {
  try {
    const v = localStorage.getItem(MODE_KEY);
    return v === 'detail' ? 'detail' : 'icon';
  } catch {
    return 'icon';
  }
}

const VALID_KEYS: FileSortKey[] = ['name', 'modified', 'size'];
const VALID_DIRS: FileSortDir[] = ['asc', 'desc'];

function readStoredSort(): FileSortState {
  try {
    const raw = localStorage.getItem(SORT_KEY);
    if (!raw) return DEFAULT_FILE_SORT;
    const parsed = JSON.parse(raw) as Partial<FileSortState>;
    if (parsed && VALID_KEYS.includes(parsed.key as FileSortKey) && VALID_DIRS.includes(parsed.dir as FileSortDir)) {
      return { key: parsed.key as FileSortKey, dir: parsed.dir as FileSortDir };
    }
  } catch {
    /* 不正な保存値は既定にフォールバック */
  }
  return DEFAULT_FILE_SORT;
}

export interface UseFileView {
  viewMode: FileViewMode;
  setViewMode: (mode: FileViewMode) => void;
  sort: FileSortState;
  setSort: (sort: FileSortState) => void;
  /** 列見出しクリック: 同じ列で反転、別の列で既定向き。 */
  toggleSort: (key: FileSortKey) => void;
  /** view 状態に従って並べ替え済みのエントリ。 */
  sortedEntries: LocalFileEntry[];
}

export function useFileView(entries: LocalFileEntry[]): UseFileView {
  const [viewMode, setViewModeState] = useState<FileViewMode>(readStoredMode);
  const [sort, setSortState] = useState<FileSortState>(readStoredSort);

  const setViewMode = useCallback((mode: FileViewMode) => {
    setViewModeState(mode);
    try {
      localStorage.setItem(MODE_KEY, mode);
    } catch {
      /* localStorage 不可でもメモリ状態は更新する */
    }
  }, []);

  const persistSort = useCallback((next: FileSortState) => {
    try {
      localStorage.setItem(SORT_KEY, JSON.stringify(next));
    } catch {
      /* localStorage 不可でもメモリ状態は更新する */
    }
  }, []);

  const setSort = useCallback((next: FileSortState) => {
    setSortState(next);
    persistSort(next);
  }, [persistSort]);

  const toggleSort = useCallback((key: FileSortKey) => {
    setSortState((cur) => {
      const next = nextSort(cur, key);
      persistSort(next);
      return next;
    });
  }, [persistSort]);

  const sortedEntries = useMemo(() => sortFileEntries(entries, sort), [entries, sort]);

  return { viewMode, setViewMode, sort, setSort, toggleSort, sortedEntries };
}
