input AssociatePublishingCompositionInput {
    gsrs: [String!]!
    pubSongId: Int!
}

input LabelUuid {
    uuid: String!
}

input ErrorMetadataInput {
    errorKey: ReportErrorKey!
    message: String
}

input PublishingCompositionAgreementInput {
    agreementId: String!
    containsPublicDomain: Boolean
    containsSample: Boolean
    hasArrangerContribution: Boolean! = false
    hasLyricsContribution: Boolean!
    hasMusicContribution: Boolean!
    label: LabelUuid
    split: String!
}

input PublishingSongWriterPublishersInput {
    controlled: Boolean!
    excludedTerritories: [String!]!
    id: ID
    ipi: String
    name: String
    pro: String
    pubPublisherID: Int
}

input CreatePublishingCompositionInput {
    agreements: [PublishingCompositionAgreementInput!]!
    alternateTitles: [String!]!
    associatedGlobalSoundRecordings: [String!]!
    associatedLabelSoundRecordings: [String!]!
    containsPublicDomain: Boolean
    containsSample: Boolean
    draft: Boolean!
    iswc: String
    label: LabelUuid!
    pubSongID: Int
    title: String!
}

input UpdatePublishingCompositionInput {
    agreements: [PublishingCompositionAgreementInput!]!
    alternateTitles: [String!]!
    associatedGlobalSoundRecordings: [String!]!
    associatedLabelSoundRecordings: [String!]!
    containsPublicDomain: Boolean
    containsSample: Boolean
    draft: Boolean!
    id: ID!
    iswc: String
    label: LabelUuid
    title: String!
}

input CreatePublishingSongWriterInput {
    ipi: String
    label: LabelUuid!
    name: String!
    pro: String
    professionallyKnownAs: [String!]
    pubWriterID: Int
    publishers: [PublishingSongWriterPublishersInput!]!
}

input CreatePublishingAgreementInput {
    ipi: String
    label: LabelUuid!
    name: String!
    pro: String
    pubWriterID: Int
    publisher: PublishingSongWriterPublishersInput!
}

input UpdatePublishingPublisherInput {
    id: ID!
    ipi: String!
    name: String!
    pro: String!
}

input UpdatePublishingSongWriterInput {
    id: ID!
    ipi: String
    label: LabelUuid!
    name: String!
    pro: String
    professionallyKnownAs: [String!]
    publishers: [PublishingSongWriterPublishersInput!]!
}

input UpdatePublishingSongWriterMetaDataInput {
    controlled: Boolean
    id: ID!
    ipi: String
    label: LabelUuid!
    name: String!
    pro: String
    professionallyKnownAs: [String!]
}

input CreateChangelogRecordInput {
    changeType: ChangeType!
    compositionId: ID!
    compositionMetadata: String
    deleted: Boolean!
    delivered: Boolean!
    entityCreatedAt: DateTime!
    entityCreatedBy: String!
    entityLastModifiedAt: DateTime!
    entityLastModifiedBy: String!
    recordId: Int = null
    songwriterMetadata: String
}

input CompositionAgreementPublisherInput {
    agreementUuid: ID!
    compositionUuid: ID!
    controlled: Boolean!
    publisherUuid: ID
}

input UpdateSongWriterAgreementsInput {
    agreements: [CompositionAgreementPublisherInput!]!
    label: LabelUuid!
    songWriterUuid: ID!
}

type Mutation {
    associatePublishingCompositionToSoundRecordings(
        input: AssociatePublishingCompositionInput!
    ): PublishingComposition!
    createChangelogRecord(input: CreateChangelogRecordInput!): ChangelogRecord!
    createChangelogReport(
        endDate: DateTime
        startDate: DateTime
        type: ReportType!
        entityId: String
    ): ChangelogReport!
    createPublishingAgreement(
        input: CreatePublishingAgreementInput!
    ): PublishingAgreement!
    createPublishingComposition(
        input: CreatePublishingCompositionInput!
    ): PublishingComposition!
    createPublishingSongWriter(
        input: CreatePublishingSongWriterInput!
    ): PublishingSongWriter!
    deletePublishingComposition(id: ID!): ID!
    deletePublishingPublisher(id: ID!): ID!
    deletePublishingSongWriter(id: ID!): ID!
    setChangelogCompositionsDelivered(
        recordIds: [Int!]!
        deliveryDate: DateTime = null
        reDeliveryDate: DateTime = null
    ): [ChangelogRecord!]!
    updateChangelogReport(
        id: Int!
        status: ReportStatus = null
        filename: String = null
        deleteReport: Boolean = null
        errorMetadata: ErrorMetadataInput
    ): ChangelogReport!
    updatePublishingComposition(
        input: UpdatePublishingCompositionInput!
    ): PublishingComposition!
    updatePublishingCompositionsDeliveryDate(
        pubSongId: Int!
        deliveryDate: String!
    ): [PublishingComposition!]!
    updatePublishingPublisher(
        input: UpdatePublishingPublisherInput!
    ): PublishingPublisher!
    updatePublishingSongWriter(
        input: UpdatePublishingSongWriterInput!
    ): PublishingSongWriter!
    updatePublishingSongWriterAgreements(
        input: UpdateSongWriterAgreementsInput!
    ): PublishingSongWriter!
    updatePublishingSongWriterMetaData(
        input: UpdatePublishingSongWriterMetaDataInput!
    ): PublishingSongWriter!
}
