import { mtMap } from '@metorial/util-resource-mapper';

export type ManagementInstanceIntegrationsInstanceGroupsProvidersListOutput = {
  items: {
    object: 'integration.instance.group.provider';
    id: string;
    status: 'active' | 'archived' | 'deleted';
    name: string;
    description: string | null;
    metadata: Record<string, any> | null;
    integrationId: string;
    integrationInstanceGroupId: string;
    integrationInstanceId: string;
    integrationProviderId: string | null;
    integrationInstanceProviderId: string;
    toolFilter:
      | { type: 'allow_all'; ignoreParentFilters: boolean }
      | {
          type: 'filter';
          filters: (
            | { type: 'tool_keys'; keys: string[] }
            | { type: 'tool_regex'; pattern: string }
            | { type: 'resource_regex'; pattern: string }
            | { type: 'resource_uris'; uris: string[] }
            | { type: 'prompt_keys'; keys: string[] }
            | { type: 'prompt_regex'; pattern: string }
          )[];
          ignoreParentFilters: boolean;
        }
      | null;
    isOverrideToolFilter: boolean;
    createdAt: Date;
    updatedAt: Date;
    archivedAt: Date | null;
  }[];
  pagination: { hasMoreBefore: boolean; hasMoreAfter: boolean };
};

export let mapManagementInstanceIntegrationsInstanceGroupsProvidersListOutput =
  mtMap.object<ManagementInstanceIntegrationsInstanceGroupsProvidersListOutput>(
    {
      items: mtMap.objectField(
        'items',
        mtMap.array(
          mtMap.object({
            object: mtMap.objectField('object', mtMap.passthrough()),
            id: mtMap.objectField('id', mtMap.passthrough()),
            status: mtMap.objectField('status', mtMap.passthrough()),
            name: mtMap.objectField('name', mtMap.passthrough()),
            description: mtMap.objectField('description', mtMap.passthrough()),
            metadata: mtMap.objectField('metadata', mtMap.passthrough()),
            integrationId: mtMap.objectField(
              'integration_id',
              mtMap.passthrough()
            ),
            integrationInstanceGroupId: mtMap.objectField(
              'integration_instance_group_id',
              mtMap.passthrough()
            ),
            integrationInstanceId: mtMap.objectField(
              'integration_instance_id',
              mtMap.passthrough()
            ),
            integrationProviderId: mtMap.objectField(
              'integration_provider_id',
              mtMap.passthrough()
            ),
            integrationInstanceProviderId: mtMap.objectField(
              'integration_instance_provider_id',
              mtMap.passthrough()
            ),
            toolFilter: mtMap.objectField(
              'tool_filter',
              mtMap.union([
                mtMap.unionOption(
                  'object',
                  mtMap.object({
                    type: mtMap.objectField('type', mtMap.passthrough()),
                    ignoreParentFilters: mtMap.objectField(
                      'ignore_parent_filters',
                      mtMap.passthrough()
                    ),
                    filters: mtMap.objectField(
                      'filters',
                      mtMap.array(
                        mtMap.union([
                          mtMap.unionOption(
                            'object',
                            mtMap.object({
                              type: mtMap.objectField(
                                'type',
                                mtMap.passthrough()
                              ),
                              keys: mtMap.objectField(
                                'keys',
                                mtMap.array(mtMap.passthrough())
                              ),
                              pattern: mtMap.objectField(
                                'pattern',
                                mtMap.passthrough()
                              ),
                              uris: mtMap.objectField(
                                'uris',
                                mtMap.array(mtMap.passthrough())
                              )
                            })
                          )
                        ])
                      )
                    )
                  })
                )
              ])
            ),
            isOverrideToolFilter: mtMap.objectField(
              'is_override_tool_filter',
              mtMap.passthrough()
            ),
            createdAt: mtMap.objectField('created_at', mtMap.date()),
            updatedAt: mtMap.objectField('updated_at', mtMap.date()),
            archivedAt: mtMap.objectField('archived_at', mtMap.date())
          })
        )
      ),
      pagination: mtMap.objectField(
        'pagination',
        mtMap.object({
          hasMoreBefore: mtMap.objectField(
            'has_more_before',
            mtMap.passthrough()
          ),
          hasMoreAfter: mtMap.objectField('has_more_after', mtMap.passthrough())
        })
      )
    }
  );

export type ManagementInstanceIntegrationsInstanceGroupsProvidersListQuery = {
  limit?: number | undefined;
  after?: string | undefined;
  before?: string | undefined;
  cursor?: string | undefined;
  order?: 'asc' | 'desc' | undefined;
} & {
  status?:
    | 'active'
    | 'archived'
    | 'deleted'
    | ('active' | 'archived' | 'deleted')[]
    | undefined;
  id?: string | string[] | undefined;
  integrationInstanceGroupId?: string | string[] | undefined;
  integrationId?: string | string[] | undefined;
  integrationInstanceId?: string | string[] | undefined;
  integrationInstanceProviderId?: string | string[] | undefined;
  providerId?: string | string[] | undefined;
  integrationProviderId?: string | string[] | undefined;
  providerDeploymentId?: string | string[] | undefined;
  providerConfigId?: string | string[] | undefined;
  providerAuthConfigId?: string | string[] | undefined;
  sessionTemplateId?: string | string[] | undefined;
  createdAt?: { gt?: Date | undefined; lt?: Date | undefined } | undefined;
  updatedAt?: { gt?: Date | undefined; lt?: Date | undefined } | undefined;
};

export let mapManagementInstanceIntegrationsInstanceGroupsProvidersListQuery =
  mtMap.union([
    mtMap.unionOption(
      'object',
      mtMap.object({
        limit: mtMap.objectField('limit', mtMap.passthrough()),
        after: mtMap.objectField('after', mtMap.passthrough()),
        before: mtMap.objectField('before', mtMap.passthrough()),
        cursor: mtMap.objectField('cursor', mtMap.passthrough()),
        order: mtMap.objectField('order', mtMap.passthrough()),
        status: mtMap.objectField(
          'status',
          mtMap.union([mtMap.unionOption('array', mtMap.union([]))])
        ),
        id: mtMap.objectField(
          'id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        integrationInstanceGroupId: mtMap.objectField(
          'integration_instance_group_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        integrationId: mtMap.objectField(
          'integration_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        integrationInstanceId: mtMap.objectField(
          'integration_instance_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        integrationInstanceProviderId: mtMap.objectField(
          'integration_instance_provider_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        providerId: mtMap.objectField(
          'provider_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        integrationProviderId: mtMap.objectField(
          'integration_provider_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        providerDeploymentId: mtMap.objectField(
          'provider_deployment_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        providerConfigId: mtMap.objectField(
          'provider_config_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        providerAuthConfigId: mtMap.objectField(
          'provider_auth_config_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        sessionTemplateId: mtMap.objectField(
          'session_template_id',
          mtMap.union([
            mtMap.unionOption('string', mtMap.passthrough()),
            mtMap.unionOption(
              'array',
              mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
            )
          ])
        ),
        createdAt: mtMap.objectField(
          'created_at',
          mtMap.object({
            gt: mtMap.objectField('gt', mtMap.date()),
            lt: mtMap.objectField('lt', mtMap.date())
          })
        ),
        updatedAt: mtMap.objectField(
          'updated_at',
          mtMap.object({
            gt: mtMap.objectField('gt', mtMap.date()),
            lt: mtMap.objectField('lt', mtMap.date())
          })
        )
      })
    )
  ]);

