import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload } from '@sphereon/did-auth-siop'
import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager'
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
import { IAgentContext, ICredentialVerifier } from '@veramo/core'
import { Request, Response } from 'express'
import { QRCodeOpts } from './QRCode.types'
import { VerifiedData } from '@sphereon/did-auth-siop'

export type SiopFeatures = 'rp-status' | 'siop'

export interface ISIOPv2RPRestAPIOpts {
  enableFeatures?: SiopFeatures[]
  endpointOpts?: {
    basePath?: string
    trustProxy?: boolean | Array<string>
    globalAuth?: GenericAuthArgs & { secureSiopEndpoints?: boolean }
    webappCreateAuthRequest?: ICreateAuthRequestWebappEndpointOpts // Override the create Auth Request path. Needs to contain correlationId and definitionId path params!
    webappDeleteAuthRequest?: ISingleEndpointOpts // Override the delete Auth Request path. Needs to contain correlationId and definitionId path params!
    webappGetDefinitions?: ISingleEndpointOpts // Override the delete Auth Request path. Needs to contain correlationId and definitionId path params!
    webappAuthStatus?: ISingleEndpointOpts // Override the Auth status path. CorrelationId and definitionId need to come from the body!
    siopVerifyAuthResponse?: ISingleEndpointOpts // Override the siop Verify Response path. Needs to contain correlationId and definitionId path params!
    siopGetAuthRequest?: ISingleEndpointOpts // Override the siop get Auth Request path. Needs to contain correlationId and definitionId path params!
  }
}
export interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpts {
  siopBaseURI?: string
  qrCodeOpts?: QRCodeOpts
  webappAuthStatusPath?: string
  webappBaseURI?: string
  responseRedirectURI?: string
}

export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPDManager
export type IRequiredContext = IAgentContext<IRequiredPlugins>

export type CreateAuthorizationRequestPayloadRequest = Request<Record<string, never>, any, CreateAuthorizationRequestPayload, Record<string, never>>

export type CreateAuthorizationResponsePayloadResponse = Response<CreateAuthorizationResponsePayload>

export type DeleteAuthorizationRequest = Request<DeleteAuthorizationRequestPathParameters, any, Record<string, any>, Record<string, any>>

export type DeleteAuthorizationRequestPathParameters = {
  correlationId: string
}

export type GetAuthorizationRequestStatus = Request<GetAuthorizationRequestStatusPathParameters, any, Record<string, any>, Record<string, any>>

export type GetAuthorizationRequestStatusPathParameters = {
  correlationId: string
}

export type RequestError = {
  status: number
  message: string
  error_details?: string
}

export interface AuthStatusResponse {
  status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus
  correlation_id: string
  query_id: string
  last_updated: number
  verified_data?: VerifiedData
  error?: RequestError
}
