/**
* Copyright Super iPaaS Integration LLC, an IBM Company 2024
*/
import { GenericAssetAdaptor } from '@apic/api-model/adaptor/GenericAssetAdaptor.js';
import { DeepRequired } from './generic/deep-required.js';
import { Metadata } from '@apic/api-model/common/Metadata.js';
import { Api, Api_Spec } from '@apic/api-model/api/Api.js';
import { PolicySequence, PolicySequence_Spec } from '@apic/api-model/policy/PolicySeq.js';
import { Routing, Routing_Spec } from '@apic/api-model/policy/routing/Routing.js';
import { Test, Test_Spec } from '@apic/api-model/test/Test.js';
import {Ref} from '@apic/api-model/common/Ref.js';
import {Environment, Environment_Spec } from '@apic/api-model/test/Environment.js';
import { MockEndpoint, MockEndpoint_Spec} from '@apic/api-model/mock/MockEndpoint.js';
import { Plan, Plan_Spec } from '@apic/api-model/package/Plan.js';
import { RequestLimit, RequestLimit_Spec } from '@apic/api-model/package/RequestLimit.js';
import { Product, Product_Spec } from '@apic/api-model/package/Product.js';


// BaseAsset
type BaseAsset = DeepRequired<GenericAssetAdaptor> & Omit<GenericAssetAdaptor, 'metadata'> & {
    metadata: DeepRequired<Metadata>
};

// API Kind
type APIAsset = DeepRequired<Api> & Omit<Api, 'spec'> & {
    spec: APISpec
}

type APISpec = DeepRequired<Api_Spec> & Omit<Api_Spec, 'policy-seq'> & {
    'policy-sequence': RefModel[]
};

type RefModel = DeepRequired<Ref> & Omit<Ref, '$ref'> & {
    $ref: string;
}

// PolicySeq Kind
type PolicySeqAsset = DeepRequired<PolicySequence> & Omit<PolicySequence, 'spec'> & {
    spec: PolicySeqSpec
}

type PolicySeqSpec = DeepRequired<PolicySequence_Spec>;

// Route Kind
type RouteAsset = DeepRequired<Routing> & Omit<Routing, 'spec'> & {
spec: RoutingSpec
};

type RoutingSpec =DeepRequired<Routing_Spec>;

// Test Kind
type TestAsset = DeepRequired<Test> & Omit <Test, 'spec'> &{
    spec: TestSpec
};

type TestSpec =DeepRequired<Test_Spec>;

// Environment Kind
type EnvironmentAsset = DeepRequired<Environment> & Omit <Environment, 'spec'> &{
    spec:EnvironmentSpec
};

type EnvironmentSpec = DeepRequired<Environment_Spec>;

//MockEndpoint Kind
type MockEndpointAsset = DeepRequired<MockEndpoint> & Omit <MockEndpoint, 'spec'> &{
    spec:MockEndpointSpec
};

type MockEndpointSpec = DeepRequired<MockEndpoint_Spec>;

type PackageAsset = DeepRequired<Product> & Omit<Product, 'spec'> & {
	spec: PackageSpec
};
type PackageSpec = DeepRequired<Product_Spec>;

type PlanAsset = DeepRequired<Plan> & Omit<Plan, 'spec'> & {
	spec: PlanSpec
};
type PlanSpec = DeepRequired<Plan_Spec>;

type RequestLimitAsset = DeepRequired<RequestLimit> & Omit<RequestLimit, 'spec'> & {
	spec: RequestLimitSpec
};
type RequestLimitSpec = DeepRequired<RequestLimit_Spec>;

// Reference Object
type RefObj = { $ref: string };

export { BaseAsset,
	APIAsset,
	RefModel,
	APISpec,
	PolicySeqAsset,
	PolicySeqSpec,
	RouteAsset,
	RoutingSpec,
	TestAsset,
	TestSpec,
	EnvironmentAsset,
	EnvironmentSpec,
	MockEndpointAsset,
	MockEndpointSpec,
	RefObj,
	PackageAsset,
	PackageSpec,
	PlanAsset,
	PlanSpec,
	RequestLimitAsset,
	RequestLimitSpec,
 };
