enum CharacterGender {
  MALE
  FEMALE
}

enum CharacterRace {
  HUMAN
  ELF
  DWARF
  ORC
  GOBLIN
}

model User {
  id                  Int                  @id @default(autoincrement())
  username            String               @unique
  email               String               @unique
  password            String
  online              Boolean              @default(false)
  characters          Character[]
  passwordResetTokens PasswordResetToken[]
}

model PasswordResetToken {
  id        Int      @id @default(autoincrement())
  userId    Int
  user      User     @relation(fields: [userId], references: [id], onDelete: Cascade)
  token     String   @unique
  createdAt DateTime @default(now())
}

model CharacterType {
  id           Int             @id @default(autoincrement())
  name         String
  gender       CharacterGender
  race         CharacterRace
  isSelectable Boolean         @default(false)
  characters   Character[]
  spriteId     String?
  sprite       Sprite?         @relation(fields: [spriteId], references: [id], onDelete: Cascade)
  createdAt    DateTime        @default(now())
  updatedAt    DateTime        @updatedAt
}

model CharacterHair {
  id           Int             @id @default(autoincrement())
  name         String
  gender       CharacterGender @default(MALE)
  isSelectable Boolean         @default(false)
  sprite       Sprite?         @relation(fields: [spriteId], references: [id], onDelete: Cascade)
  spriteId     String?
  characters   Character[]
}

model Character {
  id     Int     @id @default(autoincrement())
  userId Int
  user   User    @relation(fields: [userId], references: [id], onDelete: Cascade)
  name   String  @unique
  online Boolean @default(false)
  role   String  @default("player")
  chats  Chat[]

  // Position
  zoneId    Int  @default(1)
  zone      Zone @relation(fields: [zoneId], references: [id], onDelete: Cascade)
  positionX Int  @default(0)
  positionY Int  @default(0)
  rotation  Int  @default(0)

  // Customization
  characterTypeId Int?
  characterType   CharacterType? @relation(fields: [characterTypeId], references: [id], onDelete: Cascade)
  characterHairId Int?
  characterHair   CharacterHair? @relation(fields: [characterHairId], references: [id], onDelete: Cascade)

  // Inventory
  items     CharacterItem[]
  equipment CharacterEquipment[]

  // Stats
  alignment    Int @default(50)
  hitpoints    Int @default(100)
  mana         Int @default(100)
  level        Int @default(1)
  experience   Int @default(0)
  strength     Int @default(10)
  dexterity    Int @default(10)
  intelligence Int @default(10)
  wisdom       Int @default(10)
}

model CharacterItem {
  id                 Int                  @id @default(autoincrement())
  characterId        Int
  character          Character            @relation(fields: [characterId], references: [id], onDelete: Cascade)
  itemId             String
  item               Item                 @relation(fields: [itemId], references: [id], onDelete: Cascade)
  quantity           Int
  CharacterEquipment CharacterEquipment[]
}

model CharacterEquipment {
  id              Int                        @id @default(autoincrement())
  slot            CharacterEquipmentSlotType
  characterId     Int
  character       Character                  @relation(fields: [characterId], references: [id], onDelete: Cascade)
  characterItemId Int
  characterItem   CharacterItem              @relation(fields: [characterItemId], references: [id], onDelete: Cascade)
}

enum CharacterEquipmentSlotType {
  HEAD
  BODY
  ARMS
  LEGS
  NECK
  RING
}