

import { AssetInfo } from "../../lfs/models/asset-info.model.js";
import { Project } from "../../lfs/models/project.model.js";
import { VCSProject } from "../../vcs/models/vcs-project.model.js";
import { VCSFileInfo } from "../../vcs/models/vcs-file-info.model.js";
import { FormViewTableData } from "../../component-models/models/form-view-table-data.model.js";
import { Metadata } from "../../common/models/base-asset.model.js";
import { FileAccessType } from "../interfaces/api-spec-handler.interface.js";




export interface ApiMockInfo extends AssetInfo {
  project: Project | VCSProject;
  apiFileHandle: FileSystemFileHandle | VCSFileInfo;
  enableMocking: boolean;

}
export type ApiMockStoreModel = {
  apiMock: ApiMockInfo | null;
  data: ApiMockingSpec;
  routeFileHandle: FileSystemFileHandle | VCSFileInfo | null;
  activeResourcePath: string,
  activeResourceMethod: string,
  isValidPolicySequenceArray: {
    state: boolean,
    reason: string
  },
  isValidRouteArrayInPolicySequence: {
    state: boolean,
    reason: string
  },
}


interface ApiResponse {
  $ref: string;
}


interface ConditionalResponse {
  condition: string;
  statusCode: number;
  response: ApiResponse;
}


interface MethodResponses {
  defaultResponse: {
    [statusCode: number]:
    {
      response: ApiResponse;
    }
  };
  conditionalResponse?: ConditionalResponse[];
}


interface Paths {
  [path: string]: {
    [method: string]: MethodResponses;
  };
}


interface ApiMockingSpec {

  paths: Paths;

}


export interface ResponseHeader extends FormViewTableData {
  Key: string;
  Value: string
}

export interface ResponseBody extends FormViewTableData {
  'Content-type': string;
  'payload': string;
}

export interface ApiMockingStoreActions {
  addApiMock: (scopeInfo: ApiMockInfo) => Promise<void>;
  //setEnableMocking: (enable: boolean) => void;
  setRouteFileHandle: (fileHandle: FileSystemFileHandle | VCSFileInfo | null) => void;
  setApiMock: (apiMock: ApiMockInfo | null) => void;
  setValidPolicySequenceArray: (data: {
    state: boolean,
    reason: string
  }) => void;
  setValidRouteArrayInPolicySequence: (data: {
    state: boolean,
    reason: string
  }) => void;
  setData: (data: { paths: Record<string, any> }) => void;
  setActiveResourcePath: (path: string) => void;
  setActiveResourceMethod: (method: string) => void;
  setEnableMocking: (bool: boolean) => void;
  addStaticResponse: (statuscode: string, responseDetails: {
    name: string,
    namespace: string,
    version: string,
    project: string,
    tags: string[]
  }, headerData: ResponseHeader[], body: ResponseBody[]) => Promise<void>;
  addConditionalResponse: (condition: string, statuscode: string, responseDetails: {
    name: string,
    namespace: string,
    version: string,
    project: string,
    tags: string[]
  }, headerData: ResponseHeader[], body: ResponseBody[]) => Promise<void>;
  updateStaticResponse: (prevStatusCode: string, statuscode: string, responseDetails: {
    name: string,
    namespace: string,
    version: string,
    project: string,
    tags: string[]
  }, headerData: ResponseHeader[], body: ResponseBody[]) => Promise<void>;
  deleteStaticResponse: (statuscode: string) => Promise<void>;
  updateConditionalResponse: (condition: string, index: number, statuscode: string, responseDetails: {
    name: string,
    namespace: string,
    version: string,
    project: string,
    tags: string[]
  }, headerData: ResponseHeader[], body: ResponseBody[]) => Promise<void>;
  deleteConditionalResponse: (index: number) => Promise<void>;
  refreshData: () => Promise<void>;
  updateEndpointMetadata: (metadata: Metadata) => Promise<void>;
  updateMockResponse:(statuscode: string, responseDetails: {
    name: string,
    namespace: string,
    version: string,
    project: string,
    tags: string[]
  }, headerData: ResponseHeader[], body: ResponseBody[], mockResponseFile: FileAccessType, mockResponseProject: Project | VCSProject,condition?:string) => Promise<void>;
}
