# ===============================================
# AUTHENTICATION
# ===============================================

extend type Query {
  authentication: AuthenticationQuery
}

extend type Mutation {
  authentication: AuthenticationMutation
}

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

type AuthenticationQuery {
  apiKeys: [AuthenticationApiKey] @auth(requires: ["manage:system", "manage:api"])

  apiState: Boolean! @auth(requires: ["manage:system", "manage:api"])

  strategies: [AuthenticationStrategy] @auth(requires: ["manage:system"])

  activeStrategies(
    enabledOnly: Boolean
  ): [AuthenticationActiveStrategy]
}

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

type AuthenticationMutation {
  createApiKey(
    name: String!
    expiration: String!
    fullAccess: Boolean!
    group: Int
  ): AuthenticationCreateApiKeyResponse @auth(requires: ["manage:system", "manage:api"])

  login(
    username: String!
    password: String!
    strategy: String!
  ): AuthenticationLoginResponse @rateLimit(limit: 5, duration: 60)

  loginTFA(
    continuationToken: String!
    securityCode: String!
    setup: Boolean
  ): AuthenticationLoginResponse @rateLimit(limit: 5, duration: 60)

  loginChangePassword(
    continuationToken: String!
    newPassword: String!
  ): AuthenticationLoginResponse @rateLimit(limit: 5, duration: 60)

  forgotPassword(
    email: String!
  ): DefaultResponse @rateLimit(limit: 3, duration: 60)

  register(
    email: String!
    password: String!
    name: String!
  ): AuthenticationRegisterResponse

  revokeApiKey(
    id: Int!
  ): DefaultResponse @auth(requires: ["manage:system", "manage:api"])

  setApiState(
    enabled: Boolean!
  ): DefaultResponse @auth(requires: ["manage:system", "manage:api"])

  updateStrategies(
    strategies: [AuthenticationStrategyInput]!
  ): DefaultResponse @auth(requires: ["manage:system"])

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

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

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

type AuthenticationStrategy {
  key: String!
  props: [KeyValuePair] @auth(requires: ["manage:system"])
  title: String!
  description: String
  isAvailable: Boolean
  useForm: Boolean!
  usernameType: String
  logo: String
  color: String
  website: String
  icon: String
}

type AuthenticationActiveStrategy {
  key: String!
  strategy: AuthenticationStrategy!
  displayName: String!
  order: Int!
  isEnabled: Boolean!
  config: [KeyValuePair] @auth(requires: ["manage:system"])
  selfRegistration: Boolean!
  domainWhitelist: [String]! @auth(requires: ["manage:system"])
  autoEnrollGroups: [Int]! @auth(requires: ["manage:system"])
}

type AuthenticationLoginResponse {
  responseResult: ResponseStatus
  jwt: String
  mustChangePwd: Boolean
  mustProvideTFA: Boolean
  mustSetupTFA: Boolean
  continuationToken: String
  redirect: String
  tfaQRImage: String
}

type AuthenticationRegisterResponse {
  responseResult: ResponseStatus
  jwt: String
}

input AuthenticationStrategyInput {
  key: String!
  strategyKey: String!
  config: [KeyValuePairInput]
  displayName: String!
  order: Int!
  isEnabled: Boolean!
  selfRegistration: Boolean!
  domainWhitelist: [String]!
  autoEnrollGroups: [Int]!
}

type AuthenticationApiKey {
  id: Int!
  name: String!
  keyShort: String!
  expiration: Date!
  createdAt: Date!
  updatedAt: Date!
  isRevoked: Boolean!
}

type AuthenticationCreateApiKeyResponse {
  responseResult: ResponseStatus
  key: String
}