# ===============================================
# SYSTEM
# ===============================================

extend type Query {
  system: SystemQuery
}

extend type Mutation {
  system: SystemMutation
}

# -----------------------------------------------
# QUERIES
# -----------------------------------------------

type SystemQuery {
  flags: [SystemFlag] @auth(requires: ["manage:system"])
  info: SystemInfo
  extensions: [SystemExtension]! @auth(requires: ["manage:system"])
}

# -----------------------------------------------
# MUTATIONS
# -----------------------------------------------

type SystemMutation {
  updateFlags(
    flags: [SystemFlagInput]!
  ): DefaultResponse @auth(requires: ["manage:system"])

  resetTelemetryClientId: DefaultResponse @auth(requires: ["manage:system"])

  setTelemetry(
    enabled: Boolean!
  ): DefaultResponse @auth(requires: ["manage:system"])

  performUpgrade: DefaultResponse @auth(requires: ["manage:system"])

  importUsersFromV1(
    mongoDbConnString: String!
    groupMode: SystemImportUsersGroupMode!
  ): SystemImportUsersResponse @auth(requires:  ["manage:system"])

  setHTTPSRedirection(
    enabled: Boolean!
  ): DefaultResponse @auth(requires: ["manage:system"])

  renewHTTPSCertificate: DefaultResponse @auth(requires: ["manage:system"])
}

# -----------------------------------------------
# TYPES
# -----------------------------------------------

type SystemFlag {
  key: String!
  value: Boolean!
}

input SystemFlagInput {
  key: String!
  value: Boolean!
}

type SystemInfo {
  configFile: String @auth(requires: ["manage:system"])
  cpuCores: Int @auth(requires: ["manage:system"])
  currentVersion: String @auth(requires: ["manage:system"])
  dbHost: String @auth(requires: ["manage:system"])
  dbType: String @auth(requires: ["manage:system"])
  dbVersion: String @auth(requires: ["manage:system"])
  groupsTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:groups", "write:groups", "manage:users", "write:users"])
  hostname: String @auth(requires: ["manage:system"])
  httpPort: Int @auth(requires: ["manage:system"])
  httpRedirection: Boolean @auth(requires: ["manage:system"])
  httpsPort: Int @auth(requires: ["manage:system"])
  latestVersion: String @auth(requires: ["manage:system"])
  latestVersionReleaseDate: Date @auth(requires: ["manage:system"])
  nodeVersion: String @auth(requires: ["manage:system"])
  operatingSystem: String @auth(requires: ["manage:system"])
  pagesTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:pages", "delete:pages"])
  platform: String @auth(requires: ["manage:system"])
  ramTotal: String @auth(requires: ["manage:system"])
  sslDomain: String @auth(requires: ["manage:system"])
  sslExpirationDate: Date @auth(requires: ["manage:system"])
  sslProvider: String @auth(requires: ["manage:system"])
  sslStatus: String @auth(requires: ["manage:system"])
  sslSubscriberEmail: String @auth(requires: ["manage:system"])
  tagsTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:pages", "delete:pages"])
  telemetry: Boolean @auth(requires: ["manage:system"])
  telemetryClientId: String @auth(requires: ["manage:system"])
  upgradeCapable: Boolean @auth(requires: ["manage:system"])
  usersTotal: Int @auth(requires: ["manage:system", "manage:navigation", "manage:groups", "write:groups", "manage:users", "write:users"])
  workingDirectory: String @auth(requires: ["manage:system"])
}

enum SystemImportUsersGroupMode {
  MULTI
  SINGLE
  NONE
}

type SystemImportUsersResponse {
  responseResult: ResponseStatus
  usersCount: Int
  groupsCount: Int
  failed: [SystemImportUsersResponseFailed]
}

type SystemImportUsersResponseFailed {
  provider: String
  email: String
  error: String
}

type SystemExtension {
  key: String!
  title: String!
  description: String!
  isInstalled: Boolean!
  isCompatible: Boolean!
}
