type UserAccount {
  id: ID!
  email: String!
  createdAt: Time!
  fullName: String!
  initials: String!
  bio: String!
  role: Role!
  username: String!
  profileIcon: ProfileIcon!
  owned: OwnedList!
  member: MemberList!
}

type InvitedUserAccount {
  id: ID!
  email: String!
  invitedOn: Time!
  member: MemberList!
}

extend type Mutation {
  createUserAccount(input: NewUserAccount!):
    UserAccount! @hasRole(roles: [ADMIN], level: ORG, type: ORG)
  deleteUserAccount(input: DeleteUserAccount!):
    DeleteUserAccountPayload! @hasRole(roles: [ADMIN], level: ORG, type: ORG)
  deleteInvitedUserAccount(input: DeleteInvitedUserAccount!):
    DeleteInvitedUserAccountPayload! @hasRole(roles: [ADMIN], level: ORG, type: ORG)

  logoutUser(input: LogoutUser!): Boolean!
  clearProfileAvatar:  UserAccount!

  updateUserPassword(input: UpdateUserPassword!): UpdateUserPasswordPayload!
  updateUserRole(input: UpdateUserRole!):
   UpdateUserRolePayload! @hasRole(roles: [ADMIN], level: ORG, type: ORG)
  updateUserInfo(input: UpdateUserInfo!):
    UpdateUserInfoPayload! @hasRole(roles: [ADMIN], level: ORG, type: ORG)
}

extend type Query {
  searchMembers(input: MemberSearchFilter!): [MemberSearchResult!]!
}

input DeleteInvitedUserAccount {
  invitedUserID: UUID!
}

type DeleteInvitedUserAccountPayload {
  invitedUser: InvitedUserAccount!
}

input MemberSearchFilter {
  searchFilter: String!
  projectID: UUID
}


type MemberSearchResult {
  similarity: Int!
  id: String!
  user: UserAccount
  status: ShareStatus!
}

type UpdateUserInfoPayload {
  user: UserAccount!
}

input UpdateUserInfo {
  name: String!
  initials: String!
  email: String!
  bio: String!
}

input UpdateUserPassword {
  userID: UUID!
  password: String!
}

type UpdateUserPasswordPayload {
  ok: Boolean!
  user: UserAccount!
}

input UpdateUserRole {
  userID: UUID!
  roleCode: RoleCode!
}

type UpdateUserRolePayload {
  user: UserAccount!
}

input NewUserAccount {
  username: String!
  email: String!
  fullName: String!
  initials: String!
  password: String!
  roleCode: String!
}

input LogoutUser {
  userID: UUID!
}

input DeleteUserAccount {
  userID: UUID!
  newOwnerID: UUID
}

type DeleteUserAccountPayload {
  ok: Boolean!
  userAccount: UserAccount!
}

