import { createContext, useContext, type ReactNode } from 'react';
import {
  fetchSubtaskActivity,
  fetchSubtaskFiles,
  subtaskFileRawUrl,
  fetchSharedSubtaskActivity,
  fetchSharedSubtaskFiles,
  sharedSubtaskFileRawUrl,
  type SubtaskFiles,
} from '../../api';

/**
 * TaskDataSource — タスク詳細パネルが必要とするデータ取得を抽象化する。
 *
 * 本体（認証版）は `/api/local/...` を叩き readonly=false。共有ページは
 * トークンベースの `/api/shared/:token/...` を叩き readonly=true。
 * これにより `LocalDetailPanel` / `SubtasksPanel` を共有ページで read-only
 * 再利用でき、独自実装のドリフトを防ぐ。
 *
 * 重要（後方互換）: Provider 未設置時、useTaskDataSource() は authed 既定を
 * 返す。本体は Provider を新たに必須化しない。
 */
export interface TaskDataSource {
  /** 編集系 UI を隠すかどうか。authed=false / shared=true。 */
  readonly: boolean;
  /** 個別サブタスクの activity.log（全文）を取得する。 */
  fetchSubtaskActivity(taskId: number, jobId: string): Promise<string>;
  /** 個別サブタスクのファイル一覧（output/logs/input）を取得する。 */
  fetchSubtaskFiles(taskId: number, jobId: string): Promise<SubtaskFiles>;
  /** サブタスクのファイルへの直接 raw URL（`category/relPath` 形式）。 */
  subtaskFileRawUrl(taskId: number, jobId: string, filePath: string): string;
}

/** 認証版（本体既定）。`/api/local/...` を使い readonly=false。 */
export function createAuthedTaskDataSource(): TaskDataSource {
  return {
    readonly: false,
    fetchSubtaskActivity,
    fetchSubtaskFiles,
    subtaskFileRawUrl,
  };
}

/** 共有版（read-only）。`/api/shared/:token/...` を使い readonly=true。 */
export function createSharedTaskDataSource(token: string): TaskDataSource {
  return {
    readonly: true,
    fetchSubtaskActivity: (_taskId: number, jobId: string): Promise<string> =>
      fetchSharedSubtaskActivity(token, jobId),
    fetchSubtaskFiles: (_taskId: number, jobId: string): Promise<SubtaskFiles> =>
      fetchSharedSubtaskFiles(token, jobId),
    subtaskFileRawUrl: (_taskId: number, jobId: string, filePath: string): string =>
      sharedSubtaskFileRawUrl(token, jobId, filePath),
  };
}

// Provider 未設置時の既定 = authed。本体（Tasks ページ / Space チャット）は
// この既定にそのまま乗るため、Provider を増設しなくても従来挙動を保つ。
const TaskDataSourceContext = createContext<TaskDataSource>(createAuthedTaskDataSource());

export function TaskDataSourceProvider({
  value,
  children,
}: {
  value: TaskDataSource;
  children: ReactNode;
}) {
  return (
    <TaskDataSourceContext.Provider value={value}>{children}</TaskDataSourceContext.Provider>
  );
}

export function useTaskDataSource(): TaskDataSource {
  return useContext(TaskDataSourceContext);
}
