scalar Time
scalar UUID
scalar Upload

enum RoleCode {
  owner
  admin
  member
  observer
}

type ProjectLabel {
  id: ID!
  createdDate: Time!
  labelColor: LabelColor!
  name: String
}

type LabelColor {
  id: ID!
  name: String!
  position: Float!
  colorHex: String!
}

type TaskLabel {
  id: ID!
  projectLabel: ProjectLabel!
  assignedDate: Time!
}

type ProfileIcon {
  url: String
  initials: String
  bgColor: String
}

type OwnersList  {
  projects: [UUID!]!
  teams: [UUID!]!
}

type Member {
  id: ID!
  role: Role!
  fullName: String!
  username: String!
  profileIcon: ProfileIcon!
  owned: OwnedList!
  member: MemberList!
}

type Role {
  code: String!
  name: String!
}

type OwnedList {
  teams: [Team!]!
  projects: [Project!]!
}

type MemberList {
  teams: [Team!]!
  projects: [Project!]!
}

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!
}

type Team {
  id: ID!
  createdAt: Time!
  name: String!
  permission: TeamPermission!
  members: [Member!]!
}


type InvitedMember {
  email: String!
  invitedOn: Time!
}

type TeamPermission {
  team: RoleCode!
  org: RoleCode!
}

type ProjectPermission {
  team: RoleCode!
  project: RoleCode!
  org: RoleCode!
}

type Project {
  id: ID!
  createdAt: Time!
  name: String!
  team: Team
  taskGroups: [TaskGroup!]!
  members: [Member!]!
  invitedMembers: [InvitedMember!]!
  publicOn: Time
  permission: ProjectPermission!
  labels: [ProjectLabel!]!
}

type TaskGroup {
  id: ID!
  projectID: String!
  createdAt: Time!
  name: String!
  position: Float!
  tasks: [Task!]!
}

type ChecklistBadge {
  complete: Int!
  total: Int!
}

type TaskBadges {
  checklist: ChecklistBadge
}

type CausedBy {
  id: ID!
  fullName: String!
  profileIcon: ProfileIcon
}

type TaskActivityData {
  name: String!
  value: String!
}

enum ActivityType {
  TASK_ADDED
  TASK_MOVED
  TASK_MARKED_COMPLETE
  TASK_MARKED_INCOMPLETE
  TASK_DUE_DATE_CHANGED
  TASK_DUE_DATE_ADDED
  TASK_DUE_DATE_REMOVED
  TASK_CHECKLIST_CHANGED
  TASK_CHECKLIST_ADDED
  TASK_CHECKLIST_REMOVED
}

type TaskActivity {
  id: ID!
  type: ActivityType!
  data: [TaskActivityData!]!
  causedBy: CausedBy!
  createdAt: Time!
}

type Task {
  id: ID!
  taskGroup: TaskGroup!
  createdAt: Time!
  name: String!
  position: Float!
  description: String
  dueDate: Time
  hasTime: Boolean!
  complete: Boolean!
  completedAt: Time
  assigned: [Member!]!
  labels: [TaskLabel!]!
  checklists: [TaskChecklist!]!
  badges: TaskBadges!
  activity: [TaskActivity!]!
  comments: [TaskComment!]!
}

type CreatedBy {
  id: ID!
  fullName: String!
  profileIcon: ProfileIcon!
}

type TaskComment {
  id: ID!
  createdAt: Time!
  updatedAt: Time
  message: String!
  createdBy: CreatedBy!
  pinned: Boolean!
}

type Organization {
  id: ID!
  name: String!
}

type TaskChecklistItem {
  id: ID!
  name: String!
  taskChecklistID: UUID!
  complete: Boolean!
  position: Float!
  dueDate: Time!
}

type TaskChecklist {
  id: ID!
  name: String!
  position: Float!
  items: [TaskChecklistItem!]!
}
