/* Options:
Date: 2025-06-19 08:50:27
SwiftVersion: 5.0
Version: 8.30
Tip: To override a DTO option, remove "//" prefix before updating
BaseUrl: https://api.sanctionssearch.com/v2

//BaseClass: 
//AddModelExtensions: True
//AddServiceStackTypes: True
IncludeTypes: UpdateClient.*
//ExcludeTypes: 
//ExcludeGenericBaseTypes: False
//AddResponseStatus: False
//AddImplicitVersion: 
//AddDescriptionAsComments: True
//InitializeCollections: True
//TreatTypesAsStrings: 
//DefaultImports: Foundation,ServiceStack
*/

import Foundation
import ServiceStack

// @Route("/clients/{Id}", "PUT")
// @DataContract
public class UpdateClient : BaseRequest, IReturn
{
    public typealias Return = UpdateClientResponse

    // @DataMember
    // @ApiMember(IsRequired=true, ParameterType="path")
    public var id:Int

    // @DataMember
    public var request:Client

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case id
        case request
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decodeIfPresent(Int.self, forKey: .id)
        request = try container.decodeIfPresent(Client.self, forKey: .request)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if id != nil { try container.encode(id, forKey: .id) }
        if request != nil { try container.encode(request, forKey: .request) }
    }
}

// @DataContract
public class UpdateClientResponse : Codable
{
    // @DataMember
    public var data:UpdateClientData

    required public init(){}
}

// @DataContract
public class Authentication : Codable
{
    /**
    * The API User ID provided by us when you signed up to use our API. Can be provided in the request body, or as a header parameter (X-Api-User)
    */
    // @DataMember
    // @ApiMember(Description="The API User ID provided by us when you signed up to use our API. Can be provided in the request body, or as a header parameter (X-Api-User)", IsRequired=true, ParameterType="header, body")
    public var apiUserId:String

    /**
    * The API User Key provided by us when you signed up to use our API. Can be provided in the request body, or as a header parameter (X-Api-Key)
    */
    // @DataMember
    // @ApiMember(Description="The API User Key provided by us when you signed up to use our API. Can be provided in the request body, or as a header parameter (X-Api-Key)", IsRequired=true, ParameterType="header, body")
    public var apiUserKey:String

    /**
    * The User ID of the user making the request (e.g. a sub user). This is optional but can be used to associate API requests with a specific user, thereby allowing user permissions to be enforced. Can be provided in the body, or as a header parameter (X-User-Id).
    */
    // @DataMember
    // @ApiMember(Description="The User ID of the user making the request (e.g. a sub user). This is optional but can be used to associate API requests with a specific user, thereby allowing user permissions to be enforced. Can be provided in the body, or as a header parameter (X-User-Id).", ParameterType="header, body")
    public var userId:String

    required public init(){}
}

// @DataContract
public class BaseRequest : IBaseRequest, Codable
{
    /**
    * The authentication credentials
    */
    // @DataMember
    // @ApiMember(Description="The authentication credentials", IsRequired=true, ParameterType="header, body")
    public var authentication:Authentication

    required public init(){}
}

public protocol IBaseRequest
{
    var authentication:Authentication { get set }

}

// @DataContract(Name="ClientState", Namespace="http://schemas.servicestack.net/types")
public enum ClientState : String, Codable
{
    case Undefined
    case PendingCompletion
    case PendingOcr
    case PendingVerification
    case Verified
}

public class Client : Codable
{
    public var id:Int
    public var dateCreated:Date
    public var name:String
    public var email:String
    public var reference:String
    public var state:ClientState
    public var mobileInternational:String
    public var postCode:String
    public var isValidateMe:Bool
    public var face:Face
    public var video:Video
    public var location:Location
    public var numOfDocuments:Int
    public var numOfVideos:Int
    public var passports:ArrayOfPassports
    public var drivingLicences:ArrayOfDrivingLicences
    public var otherDocuments:ArrayOfOtherDocuments
    public var proofOfDocumentCategories:ArrayOfProofOfDocumentCategories

    required public init(){}
}

public class UpdateClientData : BaseResponse
{
    public var client:Client

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case client
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        client = try container.decodeIfPresent(Client.self, forKey: .client)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if client != nil { try container.encode(client, forKey: .client) }
    }
}

public class ArrayOfProofOfDocumentCategories : List<ProofOfDocumentCategory>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class Face : Codable
{
    public var age:Double?
    public var gender:String
    public var emotion:String
    public var smile:Double?
    public var hairColour:String
    public var facialHair:String
    public var makeup:String
    public var glasses:String
    public var accessories:String

    required public init(){}
}

public class Video : Codable
{
    public var id:Int
    public var videoUrl:String
    public var imageUrl:String
    public var videoTimestamps:[VideoTimestamp] = []

    required public init(){}
}

public class Location : Codable
{
    public var latitude:Double
    public var longitude:Double

    required public init(){}
}

public class ArrayOfPassports : List<Passport>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class ArrayOfDrivingLicences : List<DrivingLicence>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class ArrayOfOtherDocuments : List<OtherDocument>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class BaseResponse : IBaseDataResponse, IHasResponseStatus, Codable
{
    /**
    * The status of the response
    */
    // @ApiMember(Description="The status of the response")
    public var responseStatus:ResponseStatus

    required public init(){}
}

public protocol IBaseDataResponse
{
    var responseStatus:ResponseStatus { get set }

}

public protocol IHasResponseStatus
{
    var responseStatus:ResponseStatus { get set }

}

public class ProofOfDocumentCategory : Codable
{
    /**
    * The ID of the ProofOfDocumentCategory
    */
    // @ApiMember(Description="The ID of the ProofOfDocumentCategory", IsRequired=true)
    public var id:Int

    /**
    * The category or subject that requires proof (e.g., 'Name', 'Address', 'Right to work')
    */
    // @ApiMember(Description="The category or subject that requires proof (e.g., 'Name', 'Address', 'Right to work')", IsRequired=true)
    public var proofOf:String

    /**
    * The documents that can be used to provide proof for the specified category.
    */
    // @ApiMember(Description="The documents that can be used to provide proof for the specified category.", IsRequired=true)
    public var proofOfDocuments:ArrayOfProofOfDocuments

    required public init(){}
}

public class VideoTimestamp : Codable
{
    public var tagName:String
    public var milli:Int?
    public var imageUrl:String

    required public init(){}
}

public class Passport : Codable
{
    public var clientFileId:Int
    public var firstName:String
    public var middleName:String
    public var lastName:String
    public var dateOfBirth:String
    public var gender:String
    public var mrzLineOne:String
    public var mrzLineTwo1:String
    public var mrzLineTwo2:String
    public var mrzLineTwo3:String
    public var mrzLineTwo4:String
    public var mrzLineTwo5:String
    public var mrzLineTwo6:String
    public var mrzLineTwo7:String
    public var mrzLineTwo8:String
    public var images:ArrayOfImages
    public var isVerified:Bool
    public var isFaceMatch:Bool?
    public var faceMatchConfidence:Double?
    public var hasPcvSearch:Bool
    public var hasDfaSearch:Bool
    public var isPassportChipVerified:Bool?
    public var passportChipData:PassportChipData
    public var isEligibleForPcv:Bool
    public var isEligibleForDfa:Bool

    required public init(){}
}

public class DrivingLicence : Codable
{
    public var clientFileId:Int
    public var firstName:String
    public var middleName:String
    public var lastName:String
    public var dateOfBirth:String
    public var address:String
    public var drivingLicenceNumber:String
    public var images:ArrayOfImages
    public var isVerified:Bool
    public var isFaceMatch:Bool?
    public var faceMatchConfidence:Double?
    public var hasDfaSearch:Bool

    required public init(){}
}

public class OtherDocument : Codable
{
    public var clientFileId:Int
    public var type:String
    public var typeOther:String
    public var Description:String
    public var originalImageUrl:String
    public var croppedImageUrl:String
    public var isVerified:Bool

    required public init(){}
}

public class ArrayOfResponseError : List<ResponseError>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class ArrayOfProofOfDocuments : List<ProofOfDocument>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class ArrayOfImages : List<Image>
{
    required public init(){ super.init() }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
    }
}

public class PassportChipData : Codable
{
    public var isIssuerVerified:Bool
    public var issuerCommonName:String
    public var issuerOrganisationName:String
    public var issuerCountry:String
    public var mrzLine1:String
    public var mrzLine2:String
    public var isMrzLine1Verified:Bool
    public var isMrzLine2Verified:Bool
    public var dataGroupsVerified:[Int] = []
    public var dataGroupsFailed:[Int] = []
    public var isFaceMatch:Bool
    public var faceMatchConfidence:Double?

    required public init(){}
}

public class Image : Codable
{
    public var id:Int
    public var name:String
    public var ocrId:Int?
    public var url:String

    required public init(){}
}

public class ProofOfDocument : Codable
{
    /**
    * The ID of the ProofOfDocument
    */
    // @ApiMember(Description="The ID of the ProofOfDocument", IsRequired=true)
    public var id:Int

    /**
    * The name of the ProofOfDocument
    */
    // @ApiMember(Description="The name of the ProofOfDocument", IsRequired=true)
    public var name:String

    required public init(){}
}