enum NrContributorsOrderBy {
    ABACUS_UNASSIGNED_CONTRIBUTIONS_COUNT
    ID
    NAME
}

enum NrContributorDeliveryStoreStatus {
    AGREEMENT_ON_HOLD
    AGREEMENT_TERMINATED
    AWAITING_CLIENT_INFO
    AWAITING_CONTENT
    CLIENT_ACTION_REQUIRED
    CLIENT_INFO_RECEIVED
    DISPUTE
    NOT_CONTROLLED_IN_TERRITORY
    NOT_QUALIFY
    REGISTERED
    REGISTERED_VIA_ACTRA
    REGISTERED_VIA_ADAMI
    REGISTERED_VIA_ITSRIGHT
    REGISTERED_VIA_NUOVO_IMAIE
    REGISTERED_VIA_PLAYRIGHT
    REGISTERED_VIA_PPL
    REGISTERED_VIA_SENA
    REGISTRATION_CONFIRMED
    REGISTRATION_ENQUIRY
    REGISTRATION_GENERATED
    REGISTRATION_NOT_REQUIRED
    REGISTRATION_REQUIRED
    REGISTRATION_SENT
    REPRESENTATION_RELINQUISHED
    REQUIRES_RELINQUISHMENT
    SOCIETY_REVIEWING
    WAITING_FOR_REGISTRATION_DEADLINE
    WAITING_FOR_RIGHTS_PERIOD
}

enum NrContributorSearchOrderByField {
    ABACUS_UNASSIGNED_CONTRIBUTIONS_COUNT
    NAME
}

interface Contributor {
    forename: String
    id: ID!
    middleNames: [String!]!
    name: String!
    surname: String
}

type NrContributorsResult {
    contributors: [NrContributor!]
    totalCount: Int!
}

type NrContributor implements Contributor @key(fields: "id") {
    # number of contributions not assigned to an abacus schedule
    abacusUnassignedContributionsCount: Int!
        @ppCanPerform(resource: "contribution", action: "view:accounting")
    countryOfBirth: String
        @ppCanPerform(resource: "contribution", action: "view:nr")
    countryOfResidency: String
        @ppCanPerform(resource: "contribution", action: "view:nr")
    dateOfBirth: DateTime
        @ppCanPerform(resource: "contribution", action: "view:nr")
    externalId: String
        @ppCanPerform(resource: "contribution", action: "view:nr")
    forename: String @ppCanPerform(resource: "contribution", action: "view:nr")
    gender: String @ppCanPerform(resource: "contribution", action: "view:nr")
    id: ID!
    ipn: String @ppCanPerform(resource: "contribution", action: "view:nr")
    knrEntity: String @ppCanPerform(resource: "contribution", action: "view:nr")
    middleNames: [String!]!
        @ppCanPerform(resource: "contribution", action: "view:nr")
    name: String! @ppCanPerform(resource: "contribution", action: "view:basic")
    passportExpiryDate: DateTime
        @ppCanPerform(resource: "contribution", action: "view:nr")
    passportNumber: String
        @ppCanPerform(resource: "contribution", action: "view:nr")
    stores(
        filter: NrContributorDeliveryStoreFilter! = {}
    ): [NrContributorDeliveryStore!]!
        @ppCanPerform(resource: "contribution", action: "view:nr")
    surname: String @ppCanPerform(resource: "contribution", action: "view:nr")
    vendor: Vendor @ppCanPerform(resource: "contribution", action: "view:nr")
}

type NrContributorDeliveryStore {
    deliveryStore: DeliveryStore!
    nrContributor: NrContributor!
    performerId: String
    status: NrContributorDeliveryStoreStatus!
}

input NrContributorDeliveryStoreFilter {
    statuses: [NrContributorDeliveryStoreStatus!]
    storeIds: [ID!]
}

input CreateNrContributorInput {
    forename: String!
    middleNames: [String!]
    surname: String!
    vendorId: Int!
}

input NrContributorSearchFilterInput {
    hasContributions: Boolean
    hasUnassignedContributionsCount: Boolean = false
}

extend type Query {
    nrContributorById(id: ID!): NrContributor
        @ppCanPerform(resource: "contribution", action: "view:basic")

    nrContributorSearch(
        term: String!
        filters: NrContributorSearchFilterInput
        limit: Int = 10
        offset: Int = 0
        orderBy: NrContributorSearchOrderByField
        orderDir: OrderDir
    ): NrContributorsResult!
        @ppCanPerform(resource: "contribution", action: "view:basic")

    nrContributors(
        """
        Max of 55 contributor ids at a time.
        """
        contributorIds: [ID!]
        limit: Int = 20
        offset: Int = 0
        orderBy: NrContributorsOrderBy = NAME
        orderDir: OrderDir = ASC
        hasContributions: Boolean
    ): NrContributorsResult!
        @ppCanPerform(resource: "contribution", action: "view:basic")

    nrContributorsByStore(cmoId: ID!, contributorIds: [ID!]): [NrContributor!]
        @ppCanPerform(resource: "contribution", action: "view:nr")

    nrRegisteredContributorsByStore(cmoId: ID!): [NrContributor!]!
        @ppCanPerform(resource: "contribution", action: "view:nr")
}

extend type Mutation {
    createNrContributor(input: CreateNrContributorInput!): NrContributor!
}
