enum FsEmailCampaignStatus {
    CANCELLED
    DRAFT
    IN_PROGRESS
    SCHEDULED
    SENT
}

enum FsEmailCampaignSearchContext {
    AUDIENCE
}

input FsCreateEmailCampaignInput {
    cssContent: String!
    fanDataListId: FsAudienceFanDataListItemInput!
    htmlContent: String!
    name: String!
    subaccountId: Int!
    vendorId: Int!
}

type FsEmailCampaignEmailDomain {
    brand: String!
    domain: String!
    id: ID!
}

type FsEmailCampaignAudience {
    fanCount: Int!
    id: ID!
    isArchived: Boolean!
    name: String!
    target: FsAudienceTarget!
}

type FsEmailCampaign {
    analytics: FsEmailAnalyticsData
    audience: FsEmailCampaignAudience
    createdAt: String!
    createdBy: Identity!
    emailDomain: FsEmailCampaignEmailDomain
    emailUsername: String
    fanDataList: FsFanDataListItem
    hasUnappliedChanges: Boolean!
    id: ID!
    label: Label!
    name: String!
    previewText: String
    recipientsCount: Float
    sendAt: String
    sendAtTimezone: String
    senderName: String
    status: FsEmailCampaignStatus!
    subject: String
    updatedAt: String!
    updatedBy: Identity!
}

type FsEmailCampaignCompact {
    id: ID!
    name: String!
}

type FsEmailPrivacyFooter {
    content: String!
}

type FsEmailAnalyticsData {
    bounceRate: Float!
    bounceRateChange: Float
    bounces: Int!
    clickThroughRate: Float!
    clickThroughRateChange: Float
    clickToOpenRate: Float!
    clickToOpenRateChange: Float
    clicks: Int!
    delivered: Int!
    deliveredRate: Float!
    deliveredRateChange: Float
    openRate: Float!
    openRateChange: Float
    opens: Int!
    sends: Int!
    spamComplaints: Int!
    spamComplaintsRate: Float!
    spamComplaintsRateChange: Float
    uniqueClicks: Int!
    uniqueClicksChange: Float
    uniqueClicksDropoff: Float
    uniqueOpens: Int!
    uniqueOpensDropoff: Float
    unsubscribeRate: Float!
    unsubscribeRateChange: Float
    unsubscribes: Int!
}

type FsEmailAnalytics {
    data: FsEmailAnalyticsData
}

type FsEmailAnalyticsLinksData {
    percentageOfTotalClicks: Float!
    totalClicks: Int!
    uniqueClicks: Int!
    url: String!
}

type FsEmailAnalyticsLinks {
    data: [FsEmailAnalyticsLinksData!]
}

type FsEmailPreview {
    css: String
    customFonts: [FsEmailCustomFont!]
    favoriteFonts: [FsEmailCustomFont!]
    html: String
    id: ID!
    name: String!
    previewText: String
    senderName: String
    subject: String
}

type FsEmailCampaignsResult {
    items: [FsEmailCampaign!]!
    limit: Int!
    offset: Int!
    total: Int!
}

type FsStripoAuthTokenResult {
    token: String!
}

type FsEmailPrivacyFooterValidationResult {
    isValid: Boolean!
}

type FsEmailCampaignLiveStatusResponse {
    emailsToSend: Int!
    sentEmails: Int!
    status: FsEmailCampaignStatus!
}

type FsEmailCampaignPublicPreview {
    url: String!
}

type FsEmailCampaignEstimatedSendDuration {
    emailsCount: Int! @deprecated(reason: "Use emailsToSend instead")
    emailsToSend: Int!
    estimatedSendDuration: Int!
}

type FsEmailCampaignsEstimatedSendDurationResponse {
    campaignId: ID!
    emailsToSend: Int!
    estimatedSendDuration: Int!
}

input FsEmailCampaignSendTestEmailInput {
    content: String
    emails: [String!]!
}

input FsUpdateEmailCampaignInput {
    audienceId: String
    emailDomainId: String
    emailUsername: String
    fanDataListId: FsAudienceFanDataListItemInput!
    name: String!
    previewText: String
    senderName: String
    subaccountId: Int!
    subject: String
    vendorId: Int!
}

input FsUpdateEmailContentInput {
    css: String
    html: String
}

input FsScheduleEmailCampaignInput {
    sendAt: String!
    timezone: String!
}

extend type Query {
    stripoAuthToken(campaignId: ID!): FsStripoAuthTokenResult
}

type FsEmailCampaignMutations {
    delete: ID!

    duplicate(name: String!): FsEmailCampaign!

    generatePublicPreview(domain: String!): FsEmailCampaignPublicPreview!

    editSchedule(input: FsScheduleEmailCampaignInput!): ID!

    schedule(input: FsScheduleEmailCampaignInput!): ID!

    send: ID!

    sendTestEmail(input: FsEmailCampaignSendTestEmailInput!): ID!

    unschedule: ID!

    update(input: FsUpdateEmailCampaignInput!): FsEmailCampaign!

    updateContent(input: FsUpdateEmailContentInput!): FsEmailPreview!
}

type FsEmailCampaignsMutations {
    campaign(campaignId: ID!): FsEmailCampaignMutations

    create(input: FsCreateEmailCampaignInput!): FsEmailCampaign!
}

extend type FansifterMutations {
    emailCampaigns: FsEmailCampaignsMutations!
}

type FsEmailCampaignQueries {
    analytics: FsEmailAnalytics

    analyticsLinks: FsEmailAnalyticsLinks

    campaign: FsEmailCampaign

    estimatedSendDuration(sendAt: String): FsEmailCampaignEstimatedSendDuration

    liveStatus: FsEmailCampaignLiveStatusResponse

    preview(applySubstitutions: Boolean): FsEmailPreview

    privacyFooter: FsEmailPrivacyFooter

    privacyFooterValidation: FsEmailPrivacyFooterValidationResult

    stripoAuthToken: FsStripoAuthTokenResult
}

type FsEmailCampaignsQueries {
    campaign(campaignId: ID!): FsEmailCampaignQueries!

    campaigns(
        fanDataListIds: [FsAudienceFanDataListItemInput!]
        audienceId: ID
        limit: Int
        offset: Int
        orderBy: String
        search: String
        statuses: [FsEmailCampaignStatus!]
        subaccountId: Int
        vendorId: Int
    ): FsEmailCampaignsResult!

    campaignsEstimatedSendDuration(
        campaignIds: [ID!]!
    ): [FsEmailCampaignsEstimatedSendDurationResponse!]

    domains(vendorId: Int!, subaccountId: Int!): [FsEmailCampaignEmailDomain!]

    search(
        audienceId: ID
        campaignIds: [ID!]
        fanDataListIds: [FsAudienceFanDataListItemInput!]
        orderBy: String
        searchContext: FsEmailCampaignSearchContext
        statuses: [FsEmailCampaignStatus!]
        limit: Int
        search: String
        subaccountId: Int
        vendorId: Int
    ): [FsEmailCampaignCompact!]!
}

extend type FansifterQueries {
    emailCampaigns: FsEmailCampaignsQueries!
}
