# Meta enums
enum FsMetaConnectionStatus {
    CONNECTED
    INVALID
    NOT_CONNECTED
    SCOPES_MISSING
    TOS_NOT_ACCEPTED
}

# Meta output types
type FsMetaUser {
    grantedScopes: [String!]!
    name: String!
    picture: String
}

type FsMetaUserConnectionAdAccount {
    businessAccountName: String
    businessAccountPicture: String
    customAudienceTosAccepted: Boolean!
    customAudienceTosUrl: String!
    id: ID!
    name: String!
}

type FsMetaUserConnection {
    adAccounts: [FsMetaUserConnectionAdAccount!]!
    requiredScopes: [String!]!
    status: FsMetaConnectionStatus!
    user: FsMetaUser
}

type FsAdAccountLabelPair {
    adAccountId: ID!
    label: Label!
}

type FsMetaAdReportingConnectionCredentials {
    connectCardUri: String!
    connectionId: String!
}

type FsMetaAdReportingConnection {
    adAccountsCount: Int!
    status: FsAppConnectionStatus!
}

type FsMetaAdAccount {
    adReportingConnectionStatus: FsAppConnectionStatus!
    adReportingSelfConnected: Boolean!
    businessAccountName: String
    businessAccountPicture: String
    campaignsCount: Int!
    externalId: String!
    id: ID!
    isSelfConnected: Boolean!
    label: Label
    name: String!
    userAdAccountId: String
    userConnectionStatus: FsMetaConnectionStatus!
    userSelfConnected: Boolean!
}

type FsMetaUserAdAccount {
    businessAccountName: String
    businessAccountPicture: String
    id: ID!
    label: Label
    name: String!
}

type FsMetaAudience {
    createdAt: String!
    externalId: String!
    fansCount: Int!
    id: ID!
    name: String!
}

type FsMetaAudienceShareStatus {
    adAccountName: String!
    audienceId: String!
    audienceName: String!
    fansCount: Int!
    processedFans: Int!
    progress: Float!
    status: FsAudienceExportStatus!
    url: String
}

type FsMetaAdAccountsResult {
    items: [FsMetaAdAccount!]!
    limit: Int!
    offset: Int!
    total: Int!
}

# Meta input types
input FsConnectMetaUserInput {
    accessToken: String!
    userId: String!
}

input FsConnectMetaAdReportingInput {
    redirectUri: String!
}

input FsDeleteMetaAdAccountInput {
    adAccountId: ID!
    subaccountId: Int!
    vendorId: Int!
}

input FsShareMetaAudienceInput {
    adAccountId: ID!
    audienceId: ID!
    justification: FsAudienceExportJustification!
    reasonNotes: String
}

input FsMetaAdAccountsInput {
    subaccountId: Int
    vendorId: Int
    limit: Int
    offset: Int
    orderBy: [String!]
}

type FsMetaConnectionQueries {
    adAccounts: [FsMetaAdAccount!]!
        @deprecated(reason: "Use adAccountsV2 with pagination instead")
    adAccountsV2(input: FsMetaAdAccountsInput): FsMetaAdAccountsResult!
    userConnection: FsMetaUserConnection!
    userAdAccounts: [FsMetaUserAdAccount!]!
    adReportingConnection: FsMetaAdReportingConnection!
    audienceShareStatus(metaAudienceId: ID!): FsMetaAudienceShareStatus
}

type FsMetaConnectionMutations {
    connectUser(input: FsConnectMetaUserInput!): FsMetaUserConnection!
    connectAdReporting(
        input: FsConnectMetaAdReportingInput!
    ): FsMetaAdReportingConnectionCredentials!
    reconnectAdReporting(
        input: FsConnectMetaAdReportingInput!
    ): FsMetaAdReportingConnectionCredentials!
    assignLabelsToAdAccounts(
        input: [FsAdAccountLabelPairInput!]!
    ): [FsAdAccountLabelPair!]!
    deleteAdAccount(input: FsDeleteMetaAdAccountInput!): ID!
    deleteUserAdAccount(adAccountId: ID!): ID!
    shareAudience(input: FsShareMetaAudienceInput!): FsMetaAudience!
}
