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

extend type Query {
  authentication: AuthenticationQuery
}

extend type Mutation {
  authentication: AuthenticationMutation
}

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

type AuthenticationQuery {
  strategies(
    isEnabled: Boolean
  ): [AuthenticationStrategy]
}

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

type AuthenticationMutation {
  login(
    username: String!
    password: String!
    strategy: String!
  ): AuthenticationLoginResponse

  loginTFA(
    loginToken: String!
    securityCode: String!
  ): DefaultResponse

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

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

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

type AuthenticationStrategy {
  isEnabled: Boolean!
  key: String!
  props: [String]
  title: String!
  description: String
  useForm: Boolean!
  logo: String
  color: String
  website: String
  icon: String
  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
  tfaRequired: Boolean
  tfaLoginToken: String
}

type AuthenticationRegisterResponse {
  responseResult: ResponseStatus
  jwt: String
}

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