/* Options:
Date: 2025-07-11 15:43:33
Version: 8.30
Tip: To override a DTO option, remove "//" prefix before updating
BaseUrl: https://api.sanctionssearch.com/v2

//GlobalNamespace: 
//AddServiceStackTypes: True
//AddResponseStatus: False
//AddImplicitVersion: 
//AddDescriptionAsComments: True
IncludeTypes: GetDbsSearch.*
//ExcludeTypes: 
//DefaultImports: package:servicestack/servicestack.dart,dart:typed_data
*/

import 'package:servicestack/servicestack.dart';
import 'dart:typed_data';

// @DataContract
class Authentication implements IConvertible
{
    /**
    * 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")
    String? apiUserId;

    /**
    * 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")
    String? apiUserKey;

    /**
    * 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")
    String? userId;

    Authentication({this.apiUserId,this.apiUserKey,this.userId});
    Authentication.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        apiUserId = json['apiUserId'];
        apiUserKey = json['apiUserKey'];
        userId = json['userId'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'apiUserId': apiUserId,
        'apiUserKey': apiUserKey,
        'userId': userId
    };

    getTypeName() => "Authentication";
    TypeContext? context = _ctx;
}

// @DataContract
class BaseRequest implements IBaseRequest, IConvertible
{
    /**
    * The authentication credentials
    */
    // @DataMember
    // @ApiMember(Description="The authentication credentials", IsRequired=true, ParameterType="header, body")
    Authentication? authentication;

    BaseRequest({this.authentication});
    BaseRequest.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        authentication = JsonConverters.fromJson(json['authentication'],'Authentication',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'authentication': JsonConverters.toJson(authentication,'Authentication',context!)
    };

    getTypeName() => "BaseRequest";
    TypeContext? context = _ctx;
}

abstract class IBaseRequest
{
    Authentication? authentication;
}

class BaseResponse implements IBaseDataResponse, IHasResponseStatus, IConvertible
{
    /**
    * The status of the response
    */
    // @ApiMember(Description="The status of the response")
    ResponseStatus? responseStatus;

    BaseResponse({this.responseStatus});
    BaseResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        responseStatus = JsonConverters.fromJson(json['responseStatus'],'ResponseStatus',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'responseStatus': JsonConverters.toJson(responseStatus,'ResponseStatus',context!)
    };

    getTypeName() => "BaseResponse";
    TypeContext? context = _ctx;
}

class LinkedTo implements IConvertible
{
    int? clientId;
    int? id;
    String? type;
    String? subtype;
    String? status;
    String? description;
    bool? isArchived;
    String? name;
    DateTime? date;

    LinkedTo({this.clientId,this.id,this.type,this.subtype,this.status,this.description,this.isArchived,this.name,this.date});
    LinkedTo.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        clientId = json['clientId'];
        id = json['id'];
        type = json['type'];
        subtype = json['subtype'];
        status = json['status'];
        description = json['description'];
        isArchived = json['isArchived'];
        name = json['name'];
        date = JsonConverters.fromJson(json['date'],'DateTime',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'clientId': clientId,
        'id': id,
        'type': type,
        'subtype': subtype,
        'status': status,
        'description': description,
        'isArchived': isArchived,
        'name': name,
        'date': JsonConverters.toJson(date,'DateTime',context!)
    };

    getTypeName() => "LinkedTo";
    TypeContext? context = _ctx;
}

class ArrayOfLinkedTo extends ListBase<LinkedTo> implements IConvertible
{
    final List<LinkedTo> l = [];
    set length(int newLength) { l.length = newLength; }
    int get length => l.length;
    LinkedTo operator [](int index) => l[index];
    void operator []=(int index, LinkedTo value) { l[index] = value; }
    ArrayOfLinkedTo();
    ArrayOfLinkedTo.fromJson(Map<String, dynamic> json) : super();
    fromMap(Map<String, dynamic> json) {
        return this;
    }

    Map<String, dynamic> toJson() => {};
    getTypeName() => "ArrayOfLinkedTo";
    TypeContext? context = _ctx;
}

class ApplicantInformation implements IConvertible
{
    String? name;
    String? dateOfBirth;
    String? email;
    String? mobileInternational;
    String? jobLocation;
    String? reference;
    String? applicantPin;

    ApplicantInformation({this.name,this.dateOfBirth,this.email,this.mobileInternational,this.jobLocation,this.reference,this.applicantPin});
    ApplicantInformation.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        name = json['name'];
        dateOfBirth = json['dateOfBirth'];
        email = json['email'];
        mobileInternational = json['mobileInternational'];
        jobLocation = json['jobLocation'];
        reference = json['reference'];
        applicantPin = json['applicantPin'];
        return this;
    }

    Map<String, dynamic> toJson() => {
        'name': name,
        'dateOfBirth': dateOfBirth,
        'email': email,
        'mobileInternational': mobileInternational,
        'jobLocation': jobLocation,
        'reference': reference,
        'applicantPin': applicantPin
    };

    getTypeName() => "ApplicantInformation";
    TypeContext? context = _ctx;
}

class DbsSearchSummary implements IConvertible
{
    int? id;
    DateTime? dateSearched;
    DateTime? dateUpdated;
    String? status;
    String? disclosureStatus;
    bool? isApplicantInfoCompleted;
    bool? isIdCheckCompleted;
    bool? isApplicationCompleted;
    bool? isApplicationSubmitted;
    bool? isApplicationDisclosed;
    String? disclosureLevel;
    ApplicantInformation? applicantInformation;

    DbsSearchSummary({this.id,this.dateSearched,this.dateUpdated,this.status,this.disclosureStatus,this.isApplicantInfoCompleted,this.isIdCheckCompleted,this.isApplicationCompleted,this.isApplicationSubmitted,this.isApplicationDisclosed,this.disclosureLevel,this.applicantInformation});
    DbsSearchSummary.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        id = json['id'];
        dateSearched = JsonConverters.fromJson(json['dateSearched'],'DateTime',context!);
        dateUpdated = JsonConverters.fromJson(json['dateUpdated'],'DateTime',context!);
        status = json['status'];
        disclosureStatus = json['disclosureStatus'];
        isApplicantInfoCompleted = json['isApplicantInfoCompleted'];
        isIdCheckCompleted = json['isIdCheckCompleted'];
        isApplicationCompleted = json['isApplicationCompleted'];
        isApplicationSubmitted = json['isApplicationSubmitted'];
        isApplicationDisclosed = json['isApplicationDisclosed'];
        disclosureLevel = json['disclosureLevel'];
        applicantInformation = JsonConverters.fromJson(json['applicantInformation'],'ApplicantInformation',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'id': id,
        'dateSearched': JsonConverters.toJson(dateSearched,'DateTime',context!),
        'dateUpdated': JsonConverters.toJson(dateUpdated,'DateTime',context!),
        'status': status,
        'disclosureStatus': disclosureStatus,
        'isApplicantInfoCompleted': isApplicantInfoCompleted,
        'isIdCheckCompleted': isIdCheckCompleted,
        'isApplicationCompleted': isApplicationCompleted,
        'isApplicationSubmitted': isApplicationSubmitted,
        'isApplicationDisclosed': isApplicationDisclosed,
        'disclosureLevel': disclosureLevel,
        'applicantInformation': JsonConverters.toJson(applicantInformation,'ApplicantInformation',context!)
    };

    getTypeName() => "DbsSearchSummary";
    TypeContext? context = _ctx;
}

class GetDbsSearchData extends BaseResponse implements IBaseSearchResponse, IConvertible
{
    ArrayOfLinkedTo? linkedTo;
    DbsSearchSummary? summary;

    GetDbsSearchData({this.linkedTo,this.summary});
    GetDbsSearchData.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        super.fromMap(json);
        linkedTo = JsonConverters.fromJson(json['linkedTo'],'ArrayOfLinkedTo',context!);
        summary = JsonConverters.fromJson(json['summary'],'DbsSearchSummary',context!);
        return this;
    }

    Map<String, dynamic> toJson() => super.toJson()..addAll({
        'linkedTo': JsonConverters.toJson(linkedTo,'ArrayOfLinkedTo',context!),
        'summary': JsonConverters.toJson(summary,'DbsSearchSummary',context!)
    });

    getTypeName() => "GetDbsSearchData";
    TypeContext? context = _ctx;
}

abstract class IBaseDataResponse
{
    ResponseStatus? responseStatus;
}

abstract class IHasResponseStatus
{
    ResponseStatus? responseStatus;
}

abstract class IBaseSearchResponse extends IBaseDataResponse
{
    ArrayOfLinkedTo? linkedTo;
}

// @DataContract
class GetDbsSearchResponse implements IConvertible
{
    // @DataMember
    GetDbsSearchData? data;

    GetDbsSearchResponse({this.data});
    GetDbsSearchResponse.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        data = JsonConverters.fromJson(json['data'],'GetDbsSearchData',context!);
        return this;
    }

    Map<String, dynamic> toJson() => {
        'data': JsonConverters.toJson(data,'GetDbsSearchData',context!)
    };

    getTypeName() => "GetDbsSearchResponse";
    TypeContext? context = _ctx;
}

// @Route("/dbs/{Id}", "GET")
// @DataContract
class GetDbsSearch extends BaseRequest implements IReturn<GetDbsSearchResponse>, IConvertible, IGet
{
    /**
    * The ID of the DBS Search
    */
    // @DataMember
    // @ApiMember(Description="The ID of the DBS Search", IsRequired=true, ParameterType="path")
    int? id;

    /**
    * Provide a value to only return a search that the specified sub user has permission to access. If this is null or empty, then sub user permissions will not be enforced and the search will be returned
    */
    // @DataMember
    // @ApiMember(Description="Provide a value to only return a search that the specified sub user has permission to access. If this is null or empty, then sub user permissions will not be enforced and the search will be returned", ParameterType="query")
    String? subUserName;

    GetDbsSearch({this.id,this.subUserName});
    GetDbsSearch.fromJson(Map<String, dynamic> json) { fromMap(json); }

    fromMap(Map<String, dynamic> json) {
        super.fromMap(json);
        id = json['id'];
        subUserName = json['subUserName'];
        return this;
    }

    Map<String, dynamic> toJson() => super.toJson()..addAll({
        'id': id,
        'subUserName': subUserName
    });

    createResponse() => GetDbsSearchResponse();
    getResponseTypeName() => "GetDbsSearchResponse";
    getTypeName() => "GetDbsSearch";
    TypeContext? context = _ctx;
}

TypeContext _ctx = TypeContext(library: 'api.sanctionssearch.com', types: <String, TypeInfo> {
    'Authentication': TypeInfo(TypeOf.Class, create:() => Authentication()),
    'BaseRequest': TypeInfo(TypeOf.Class, create:() => BaseRequest()),
    'IBaseRequest': TypeInfo(TypeOf.Interface),
    'BaseResponse': TypeInfo(TypeOf.Class, create:() => BaseResponse()),
    'LinkedTo': TypeInfo(TypeOf.Class, create:() => LinkedTo()),
    'ArrayOfLinkedTo': TypeInfo(TypeOf.Class, create:() => ArrayOfLinkedTo()),
    'ApplicantInformation': TypeInfo(TypeOf.Class, create:() => ApplicantInformation()),
    'DbsSearchSummary': TypeInfo(TypeOf.Class, create:() => DbsSearchSummary()),
    'GetDbsSearchData': TypeInfo(TypeOf.Class, create:() => GetDbsSearchData()),
    'IBaseDataResponse': TypeInfo(TypeOf.Interface),
    'IHasResponseStatus': TypeInfo(TypeOf.Interface),
    'IBaseSearchResponse': TypeInfo(TypeOf.Interface),
    'GetDbsSearchResponse': TypeInfo(TypeOf.Class, create:() => GetDbsSearchResponse()),
    'GetDbsSearch': TypeInfo(TypeOf.Class, create:() => GetDbsSearch()),
});