/**
 * GSB Entity Service Documentation
 * ==============================
 * 
 * This file serves as the central hub for all API documentation.
 * It imports documentation from individual files and provides a unified interface
 * for accessing documentation for specific methods or the entire API.
 */

// Import all documentation files
import overviewDocs, { overviewSummary } from './docs/overview.js';
import getByIdDocs, { getByIdSummary } from './docs/getById.js';
import getCopyDocs, { getCopySummary } from './docs/getCopy.js';
import queryDocs, { querySummary } from './docs/query.js';
import queryMappedDocs, { queryMappedSummary } from './docs/queryMapped.js';
import saveDocs, { saveSummary } from './docs/save.js';
import saveMultiDocs, { saveMultiSummary } from './docs/saveMulti.js';
import deleteDocs, { deleteSummary } from './docs/delete.js';
import deleteQueryDocs, { deleteQuerySummary } from './docs/deleteQuery.js';
import saveMappedItemsDocs, { saveMappedItemsSummary } from './docs/saveMappedItems.js';
import removeMappedItemsDocs, { removeMappedItemsSummary } from './docs/removeMappedItems.js';
import runWorkflowDocs, { runWorkflowSummary } from './docs/runWorkflow.js';
import startWorkflowDocs, { startWorkflowSummary } from './docs/startWorkflow.js';
import runWfFunctionDocs, { runWfFunctionSummary } from './docs/runWfFunction.js';
import iterateTaskDocs, { iterateTaskSummary } from './docs/iterateTask.js';
import getCommonPropertyDefsDocs, { getCommonPropertyDefsSummary } from './docs/getCommonPropertyDefs.js';
import createEntityDefDocs, { createEntityDefSummary } from './docs/createEntityDef.js';
import updateEntityDefDocs, { updateEntityDefSummary } from './docs/updateEntityDef.js';
import addPropertyDocs, { addPropertySummary } from './docs/addProperty.js';
import removePropertyDocs, { removePropertySummary } from './docs/removeProperty.js';
import updatePropertyDocs, { updatePropertySummary } from './docs/updateProperty.js';
import getEntityDefDocs, { getEntityDefSummary } from './docs/getEntityDef.js';
import queryEntityDefsDocs, { queryEntityDefsSummary } from './docs/queryEntityDefs.js';
import getDocsDocs, { getDocsSummary } from './docs/getDocs.js';
import getApiDocsDocs, { getApiDocsSummary } from './docs/getApiDocs.js';
import createOrUpdateSchemaDocs, { createOrUpdateSchemaSummary } from './docs/createOrUpdateSchema.js';
import queryWorkflowInstancesDocs, { queryWorkflowInstancesSummary } from './docs/queryWorkflowInstances.js';
import getWorkflowInstanceStatusDocs, { getWorkflowInstanceStatusSummary } from './docs/getWorkflowInstanceStatus.js';
import getWorkflowInstanceResultDocs, { getWorkflowInstanceResultSummary } from './docs/getWorkflowInstanceResult.js';
import testWfFunctionDocs, { testWfFunctionSummary } from './docs/testWfFunction.js';
// Import new markdown docs
import { gsbFunctionsMarkdown } from './docs/gsb-functions-docs.js';
import { gsbSchemaMarkdown } from './docs/gsb-schema-docs.js';

/**
 * Returns documentation for the specified operation or general API documentation
 * @param operation - The operation to get documentation for
 * @return Documentation in markdown format
 */
export function getDocs(operation?: string): string {
  // If no operation is specified, return the overview documentation
  if (!operation) {
    return overviewDocs();
  }

  // Return documentation for the specified operation
  switch (operation.toLowerCase()) {
    case 'getbyid':
      return getByIdDocs();
    case 'getcopy':
      return getCopyDocs();
    case 'query':
      return queryDocs();
    case 'querymapped':
      return queryMappedDocs();
    case 'save':
      return saveDocs();
    case 'savemulti':
      return saveMultiDocs();
    case 'delete':
      return deleteDocs();
    case 'deletequery':
      return deleteQueryDocs();
    case 'savemappeditems':
      return saveMappedItemsDocs();
    case 'removemappeditems':
      return removeMappedItemsDocs();
    case 'runworkflow':
      return runWorkflowDocs();
    case 'startworkflow':
      return startWorkflowDocs();
    case 'runwffunction':
      return runWfFunctionDocs();
    case 'iteratetask':
      return iterateTaskDocs();
    case 'testwffunction':
      return testWfFunctionDocs();
    case 'getcommonpropertydefs':
      return getCommonPropertyDefsDocs();
    case 'createentitydef':
      return createEntityDefDocs();
    case 'updateentitydef':
      return updateEntityDefDocs();
    case 'addproperty':
      return addPropertyDocs();
    case 'removeproperty':
      return removePropertyDocs();
    case 'updateproperty':
      return updatePropertyDocs();
    case 'getentitydef':
      return getEntityDefDocs();
    case 'queryentitydefs':
      return queryEntityDefsDocs();
    case 'getdocs':
      return getDocsDocs();
    case 'getapidocs':
      return getApiDocsDocs();
    case 'createorupdateschema':
      return createOrUpdateSchemaDocs();
    default:
      return `Documentation for '${operation}' not found. Available operations: getById, getCopy, query, queryMapped, save, saveMulti, delete, deleteQuery, saveMappedItems, removeMappedItems, getDefinition, runWorkflow, startWorkflow, runWfFunction, iterateTask, getCommonPropertyDefs, createEntityDef, updateEntityDef, addProperty, removeProperty, updateProperty, getEntityDef, queryEntityDefs, getDocs, getApiDocs, createOrUpdateSchema.`;
  }
}

/**
 * Returns a brief summary of the specified operation or general API overview
 * @param operation - The operation to get summary for
 * @return Brief summary in markdown format
 */
export function getSummary(operation?: string): string {
  // If no operation is specified, return the overview summary
  if (!operation) {
    return overviewSummary();
  }

  // Return summary for the specified operation
  switch (operation.toLowerCase()) {
    case 'getbyid':
      return getByIdSummary();
    case 'getcopy':
      return getCopySummary();
    case 'query':
      return querySummary();
    case 'querymapped':
      return queryMappedSummary();
    case 'save':
      return saveSummary();
    case 'savemulti':
      return saveMultiSummary();
    case 'delete':
      return deleteSummary();
    case 'deletequery':
      return deleteQuerySummary();
    case 'savemappeditems':
      return saveMappedItemsSummary();
    case 'removemappeditems':
      return removeMappedItemsSummary();
    case 'runworkflow':
      return runWorkflowSummary();
    case 'startworkflow':
      return startWorkflowSummary();
    case 'runwffunction':
      return runWfFunctionSummary();
    case 'iteratetask':
      return iterateTaskSummary();
    case 'getcommonpropertydefs':
      return getCommonPropertyDefsSummary();
    case 'createentitydef':
      return createEntityDefSummary();
    case 'updateentitydef':
      return updateEntityDefSummary();
    case 'addproperty':
      return addPropertySummary();
    case 'removeproperty':
      return removePropertySummary();
    case 'updateproperty':
      return updatePropertySummary();
    case 'getentitydef':
      return getEntityDefSummary();
    case 'queryentitydefs':
      return queryEntityDefsSummary();
    case 'getdocs':
      return getDocsSummary();
    case 'getapidocs':
      return getApiDocsSummary();
    case 'createorupdateschema':
      return createOrUpdateSchemaSummary();
    case 'queryworkflowinstances':
      return queryWorkflowInstancesSummary();
    case 'getworkflowinstancestatus':
      return getWorkflowInstanceStatusSummary();
    case 'getworkflowinstanceresult':
      return getWorkflowInstanceResultSummary();
    case 'testwffunction':
      return testWfFunctionSummary();
    default:
      return `Summary for '${operation}' not found. Available operations: getById, getCopy, query, queryMapped, save, saveMulti, delete, deleteQuery, saveMappedItems, removeMappedItems, getDefinition, runWorkflow, startWorkflow, runWfFunction, iterateTask, getCommonPropertyDefs, createEntityDef, updateEntityDef, addProperty, removeProperty, updateProperty, getEntityDef, queryEntityDefs, getDocs, getApiDocs, createOrUpdateSchema, queryWorkflowInstances, getWorkflowInstanceStatus, getWorkflowInstanceResult.`;
  }
}

/**
 * Returns general API documentation
 * @return General API documentation in markdown format
 */
export function getApiDocs(): string {
    return `
# GSB Entity Service API

- **Name**: GSB Entity Service API
- **Version**: 1.0.0
- **Description**: API for managing entity data and definitions

For detailed documentation on all available operations, use the \`getDocs\` operation.
`;
}

/**
 * Returns the GSB Serverless Functions documentation.
 * @return GSB Serverless Functions documentation in markdown format
 */
export function getServerlessFunctionDocs(): string {
  return gsbFunctionsMarkdown;
}

/**
 * Returns the GSB Schema Management documentation.
 * @return GSB Schema Management documentation in markdown format
 */
export function getSchemaDocs(): string {
  return gsbSchemaMarkdown;
}

export default {
  getDocs,
  getSummary,
  getApiDocs,
  getServerlessFunctionDocs,
  getSchemaDocs
}; 