
/**
* Copyright Super iPaaS Integration LLC, an IBM Company 2024
*/

/* eslint-disable @typescript-eslint/no-explicit-any */

import { Variable as Variable_Ref } from '@apic/api-model/test/common/Variable.js';
import { Test_Environment as Environment_Ref, Test_Assertions, Test_Auth, Test_Auth_BasicAuth, Test_Headers, Test_Parameters, Test_Payload, Test_Request } from '@apic/api-model/test/Test.js';
import { Metadata as Metadata_Ref } from '@apic/api-model/common/Metadata.js';
import { PolicySequence_Spec } from '@apic/api-model/policy/PolicySeq.js';
import { Assert } from '@apic/api-model/test/common/Assert.js';
import { Ref as Reference } from '@apic/api-model/common/Ref.js';
import { KindEnums } from '@apic/api-model/common/StudioEnums.js';
import { RefAndEndpoint } from '@apic/api-model/test/common/RefAndEndpoint.js';
import { PayLoadIdentifier } from '@apic/api-model/policy/common/PayLoadIdentifier.js';
import { CORS_Spec } from '@apic/api-model/policy/ResProcessing/CORS.js';
import { AuthorizeUser_Spec } from '@apic/api-model/policy/iam/AuthorizeUser.js';
import { Api } from '@apic/api-model/api/Api.js';

type WithRequired<Type, Key extends keyof Type> = Type & {
    [Property in Key]-?: Type[Property];
};
export type Metadata = WithRequired<Metadata_Ref, 'name' | 'version'>;
export type API_Spec_Ref = {
    $ref: string
    $path: string
}
export type Path = {
    path: string
}

export type PolicySequenceSpec = PolicySequence_Spec;
export type TestAssertions = Test_Assertions;
export type AssertSpec = Assert;
export type Cors_Spec = CORS_Spec;
export type Authorize_Spec = AuthorizeUser_Spec;

export type TestBasicAuth = Test_Auth_BasicAuth;
export type TestHeaders = Test_Headers;
export type TestParamters = Test_Parameters;
export type TestPayload = Test_Payload;
export type TestAuth = Test_Auth;
export type RefEndpoint = RefAndEndpoint;

export type Ref = Required<Reference>;
export type Variable = Required<Variable_Ref>;
export type Environment = Environment_Ref;
export type PolicySequence = PolicySequence_Spec;
export type Expression = Required<Assert>;
export type Assertion = Required<Test_Assertions>;
export type Request = Required<Test_Request>;
export type Specification = {
    'api-spec'?: API_Spec_Ref | string
    'policy-sequence'?: Ref[]
    'api'?: Ref | string;
    scopes?: Ref[];
    environment?: Ref | Environment;
    request?: Request[];
}
export type BaseAsset = {
    kind: string;
    metadata: Metadata;
    spec: Specification | string | any;
    paths?: any;
    info?: any;
}

export type ApiObject = Api;

export type IAMPayloadIdentifier = PayLoadIdentifier;

export const POLICY_KINDS: string[] = [
    KindEnums.CORS,
    KindEnums.Log,
    KindEnums.Route,
    KindEnums.Transport,
    KindEnums.CacheServiceResult,
    KindEnums.DataMasking,
    KindEnums.ErrorProcessing,
    KindEnums.HTTPInvoke,
    KindEnums.IdentifyAndAuthorize,
    KindEnums.InvokeAWSLambdaFunction,
    KindEnums.InvokeMessagingExtension,
    KindEnums.MonitorTraffic,
    KindEnums.RateLimiter,
    KindEnums.SetContextVariable,
    KindEnums.TransformRequest,
    KindEnums.ValidateAPISpecification,
    KindEnums.HTTPEndpoint,
    KindEnums.TransformResponse,
    KindEnums.SetMediaType,
    KindEnums.WebMethodsISService,
    KindEnums.InboundBulkHead,
    KindEnums.InboundMessaging,
    KindEnums.AuthorizeUser,
    KindEnums.CustomHttpHeader,
    KindEnums.MessageConfig,
];

export { KindEnums as AssetModelKindConstants };

export class AssetModelInternalKindConstants {
    public static readonly POLICY: string = 'Policy';
    public static readonly MOCK_END_POINT: string = 'MockEndpoint';
    public static readonly MOCK_RESPONSE: string = 'MockResponse';
}
