# ===============================================
# USERS
# ===============================================

extend type Query {
  users (
    page: Int
    pageSize: Int
    orderBy: UserOrderBy
    orderByDirection: OrderByDirection
    # Filter by name / email
    filter: String
  ): [UserMinimal]

  userById(
    id: UUID!
  ): User

  userDefaults: UserDefaults

  lastLogins: [UserLastLogin]

  userPermissions: [String]

  userPermissionsAtPath(
    siteId: UUID!
    path: String!
  ): [String]
}

extend type Mutation {
  createUser(
    email: String!
    name: String!
    password: String!
    groups: [UUID]!
    mustChangePassword: Boolean!
    sendWelcomeEmail: Boolean!
  ): UserResponse

  updateUser(
    id: UUID!
    patch: UserUpdateInput!
  ): DefaultResponse

  deleteUser(
    id: UUID!
    replaceId: UUID!
  ): DefaultResponse

  verifyUser(
    id: UUID!
  ): DefaultResponse

  activateUser(
    id: UUID!
  ): DefaultResponse

  deactivateUser(
    id: UUID!
  ): DefaultResponse

  enableUserTFA(
    id: UUID!
  ): DefaultResponse

  disableUserTFA(
    id: UUID!
  ): DefaultResponse

  changeUserPassword(
    id: UUID!
    newPassword: String!
    mustChangePassword: Boolean
  ): DefaultResponse

  updateProfile(
    name: String
    location: String
    jobTitle: String
    pronouns: String
    timezone: String
    dateFormat: String
    timeFormat: String
    appearance: UserSiteAppearance
    cvd: UserCvdChoices
  ): DefaultResponse

  uploadUserAvatar(
    id: UUID!
    image: Upload!
  ): DefaultResponse

  clearUserAvatar(
    id: UUID!
  ): DefaultResponse

  updateUserDefaults(
    timezone: String!
    dateFormat: String!
    timeFormat: String!
  ): DefaultResponse
}

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

type UserResponse {
  operation: Operation
  user: User
}

type UserLastLogin {
  id: UUID
  name: String
  lastLoginAt: Date
}

type UserMinimal {
  id: UUID
  name: String
  email: String
  isSystem: Boolean
  isActive: Boolean
  createdAt: Date
  lastLoginAt: Date
}

type User {
  id: UUID
  name: String
  email: String
  auth: [UserAuth]
  hasAvatar: Boolean
  isSystem: Boolean
  isActive: Boolean
  isVerified: Boolean
  meta: JSON
  prefs: JSON
  createdAt: Date
  updatedAt: Date
  lastLoginAt: Date
  groups: [Group]
}

type UserAuth {
  authId: UUID
  authName: String
  strategyKey: String
  strategyIcon: String
  config: JSON
}

type UserDefaults {
  timezone: String
  dateFormat: String
  timeFormat: String
}

type UserTokenResponse {
  operation: Operation
  jwt: String
}

enum UserOrderBy {
  id
  email
  name
  createdAt
  updatedAt
  lastLoginAt
}

enum UserSiteAppearance {
  site
  light
  dark
}

enum UserCvdChoices {
  none
  protanopia
  deuteranopia
  tritanopia
}

input UserUpdateInput {
  email: String
  name: String
  groups: [UUID!]
  isActive: Boolean
  isVerified: Boolean
  meta: JSON
  prefs: JSON
}
