import { AutoBePreliminaryKind } from "@autobe/interface";

import { IAutoBePreliminaryComplete } from "./IAutoBePreliminaryComplete";
import { IAutoBePreliminaryGetAnalysisSections } from "./IAutoBePreliminaryGetAnalysisSections";
import { IAutoBePreliminaryGetDatabaseSchemas } from "./IAutoBePreliminaryGetDatabaseSchemas";
import { IAutoBePreliminaryGetInterfaceOperations } from "./IAutoBePreliminaryGetInterfaceOperations";
import { IAutoBePreliminaryGetInterfaceSchemas } from "./IAutoBePreliminaryGetInterfaceSchemas";
import { IAutoBePreliminaryGetPreviousAnalysisSections } from "./IAutoBePreliminaryGetPreviousAnalysisSections";
import { IAutoBePreliminaryGetPreviousDatabaseSchemas } from "./IAutoBePreliminaryGetPreviousDatabaseSchemas";
import { IAutoBePreliminaryGetPreviousInterfaceOperations } from "./IAutoBePreliminaryGetPreviousInterfaceOperations";
import { IAutoBePreliminaryGetPreviousInterfaceSchemas } from "./IAutoBePreliminaryGetPreviousInterfaceSchemas";
import { IAutoBePreliminaryGetRealizeCollectors } from "./IAutoBePreliminaryGetRealizeCollectors";
import { IAutoBePreliminaryGetRealizeTransformers } from "./IAutoBePreliminaryGetRealizeTransformers";

/**
 * Internal function calling schema for preliminary RAG system.
 *
 * Not directly used in LLM function calling, but serves as common structure for
 * preliminary internal orchestration and validation.
 *
 * @author Samchon
 */
export interface IAutoBePreliminaryRequest<Kind extends AutoBePreliminaryKind> {
  /** LLM's reasoning about why this data is needed. */
  thinking: string;

  /** Actual request payload discriminated by `Kind`. */
  request: Mapper[Kind];
}

/** Maps preliminary `Kind` to corresponding request type. */
type Mapper = {
  analysisSections: IAutoBePreliminaryGetAnalysisSections;
  databaseSchemas: IAutoBePreliminaryGetDatabaseSchemas;
  interfaceOperations: IAutoBePreliminaryGetInterfaceOperations;
  interfaceSchemas: IAutoBePreliminaryGetInterfaceSchemas;
  realizeCollectors: IAutoBePreliminaryGetRealizeCollectors;
  realizeTransformers: IAutoBePreliminaryGetRealizeTransformers;
  previousAnalysisSections: IAutoBePreliminaryGetPreviousAnalysisSections;
  previousDatabaseSchemas: IAutoBePreliminaryGetPreviousDatabaseSchemas;
  previousInterfaceSchemas: IAutoBePreliminaryGetPreviousInterfaceSchemas;
  previousInterfaceOperations: IAutoBePreliminaryGetPreviousInterfaceOperations;
  complete: IAutoBePreliminaryComplete;
};
