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

export type DashboardInstanceSessionsConnectionsListOutput = {
  items: {
    object: 'session.connection';
    id: string;
    connectionState: 'connected' | 'disconnected';
    transport: 'mcp' | 'tool_call' | 'metorial_protocol' | 'system';
    usage: {
      totalProductiveClientMessageCount: number;
      totalProductiveProviderMessageCount: number;
    };
    mcp: {
      capabilities: Record<string, any>;
      protocolVersion: string;
      transport: 'none' | 'sse' | 'streamable_http';
    } | null;
    sessionId: string;
    participant: {
      object: 'session.participant';
      id: string;
      type: 'unknown' | 'provider' | 'agent' | 'system';
      identifier: string;
      name: string;
      data: { identifier: string; name: string };
      providerId: string | null;
      connectionType: 'mcp' | 'metorial_protocol' | 'tool_call' | null;
      agentId: string | null;
      agentInstanceId: string | null;
      identityActorId: string | null;
      identityId: string | null;
      agentActorId: string | null;
      agentClientId: string | null;
      consumerId: string | null;
      createdAt: Date;
    } | null;
    hasErrors: boolean;
    hasWarnings: boolean;
    createdAt: Date;
    lastMessageAt: Date;
    lastActiveAt: Date | null;
  }[];
  pagination: { hasMoreBefore: boolean; hasMoreAfter: boolean };
};

export let mapDashboardInstanceSessionsConnectionsListOutput =
  mtMap.object<DashboardInstanceSessionsConnectionsListOutput>({
    items: mtMap.objectField(
      'items',
      mtMap.array(
        mtMap.object({
          object: mtMap.objectField('object', mtMap.passthrough()),
          id: mtMap.objectField('id', mtMap.passthrough()),
          connectionState: mtMap.objectField(
            'connection_state',
            mtMap.passthrough()
          ),
          transport: mtMap.objectField('transport', mtMap.passthrough()),
          usage: mtMap.objectField(
            'usage',
            mtMap.object({
              totalProductiveClientMessageCount: mtMap.objectField(
                'total_productive_client_message_count',
                mtMap.passthrough()
              ),
              totalProductiveProviderMessageCount: mtMap.objectField(
                'total_productive_provider_message_count',
                mtMap.passthrough()
              )
            })
          ),
          mcp: mtMap.objectField(
            'mcp',
            mtMap.object({
              capabilities: mtMap.objectField(
                'capabilities',
                mtMap.passthrough()
              ),
              protocolVersion: mtMap.objectField(
                'protocol_version',
                mtMap.passthrough()
              ),
              transport: mtMap.objectField('transport', mtMap.passthrough())
            })
          ),
          sessionId: mtMap.objectField('session_id', mtMap.passthrough()),
          participant: mtMap.objectField(
            'participant',
            mtMap.object({
              object: mtMap.objectField('object', mtMap.passthrough()),
              id: mtMap.objectField('id', mtMap.passthrough()),
              type: mtMap.objectField('type', mtMap.passthrough()),
              identifier: mtMap.objectField('identifier', mtMap.passthrough()),
              name: mtMap.objectField('name', mtMap.passthrough()),
              data: mtMap.objectField(
                'data',
                mtMap.object({
                  identifier: mtMap.objectField(
                    'identifier',
                    mtMap.passthrough()
                  ),
                  name: mtMap.objectField('name', mtMap.passthrough())
                })
              ),
              providerId: mtMap.objectField('provider_id', mtMap.passthrough()),
              connectionType: mtMap.objectField(
                'connection_type',
                mtMap.passthrough()
              ),
              agentId: mtMap.objectField('agent_id', mtMap.passthrough()),
              agentInstanceId: mtMap.objectField(
                'agent_instance_id',
                mtMap.passthrough()
              ),
              identityActorId: mtMap.objectField(
                'identity_actor_id',
                mtMap.passthrough()
              ),
              identityId: mtMap.objectField('identity_id', mtMap.passthrough()),
              agentActorId: mtMap.objectField(
                'agent_actor_id',
                mtMap.passthrough()
              ),
              agentClientId: mtMap.objectField(
                'agent_client_id',
                mtMap.passthrough()
              ),
              consumerId: mtMap.objectField('consumer_id', mtMap.passthrough()),
              createdAt: mtMap.objectField('created_at', mtMap.date())
            })
          ),
          hasErrors: mtMap.objectField('has_errors', mtMap.passthrough()),
          hasWarnings: mtMap.objectField('has_warnings', mtMap.passthrough()),
          createdAt: mtMap.objectField('created_at', mtMap.date()),
          lastMessageAt: mtMap.objectField('last_message_at', mtMap.date()),
          lastActiveAt: mtMap.objectField('last_active_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 DashboardInstanceSessionsConnectionsListQuery = {
  limit?: number | undefined;
  after?: string | undefined;
  before?: string | undefined;
  cursor?: string | undefined;
  order?: 'asc' | 'desc' | undefined;
} & {
  status?: 'active' | 'archived' | ('active' | 'archived')[] | undefined;
  connectionState?:
    | 'connected'
    | 'disconnected'
    | ('connected' | 'disconnected')[]
    | undefined;
  id?: string | string[] | undefined;
  agentId?: string | string[] | undefined;
  actorId?: string | string[] | undefined;
  consumerId?: string | string[] | undefined;
  identityId?: string | string[] | undefined;
  agentInstanceId?: string | string[] | undefined;
  sessionId?: string | string[] | undefined;
  sessionProviderId?: string | string[] | undefined;
  participantId?: string | string[] | undefined;
  createdAt?: { gt?: Date | undefined; lt?: Date | undefined } | undefined;
  updatedAt?: { gt?: Date | undefined; lt?: Date | undefined } | undefined;
};

export let mapDashboardInstanceSessionsConnectionsListQuery = 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([]))])
      ),
      connectionState: mtMap.objectField(
        'connection_state',
        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())])
          )
        ])
      ),
      agentId: mtMap.objectField(
        'agent_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      actorId: mtMap.objectField(
        'actor_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      consumerId: mtMap.objectField(
        'consumer_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      identityId: mtMap.objectField(
        'identity_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      agentInstanceId: mtMap.objectField(
        'agent_instance_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      sessionId: mtMap.objectField(
        'session_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      sessionProviderId: mtMap.objectField(
        'session_provider_id',
        mtMap.union([
          mtMap.unionOption('string', mtMap.passthrough()),
          mtMap.unionOption(
            'array',
            mtMap.union([mtMap.unionOption('string', mtMap.passthrough())])
          )
        ])
      ),
      participantId: mtMap.objectField(
        'participant_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())
        })
      )
    })
  )
]);

