model Tile {
  id        String   @id @default(uuid())
  name      String
  tags      Json?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Object {
  id          String       @id @default(uuid())
  name        String
  tags        Json?
  originX     Decimal      @default(0)
  originY     Decimal      @default(0)
  isAnimated  Boolean      @default(false)
  frameRate  Int          @default(0)
  frameWidth  Int          @default(0)
  frameHeight Int          @default(0)
  createdAt   DateTime     @default(now())
  updatedAt   DateTime     @updatedAt
  ZoneObject  ZoneObject[]
}

model Zone {
  id                     Int                     @id @default(autoincrement())
  name                   String
  width                  Int                     @default(10)
  height                 Int                     @default(10)
  tiles                  Json?
  pvp                    Boolean                 @default(false)
  zoneEffects            ZoneEffect[]
  zoneEventTiles         ZoneEventTile[]
  zoneEventTileTeleports ZoneEventTileTeleport[]
  zoneObjects            ZoneObject[]
  characters             Character[]
  chats                  Chat[]
  createdAt              DateTime                @default(now())
  updatedAt              DateTime                @updatedAt
}

model ZoneEffect {
  id       String @id @default(uuid())
  zoneId   Int
  zone     Zone   @relation(fields: [zoneId], references: [id], onDelete: Cascade)
  effect   String
  strength Int
}

model ZoneObject {
  id        String  @id @default(uuid())
  zoneId    Int
  zone      Zone    @relation(fields: [zoneId], references: [id], onDelete: Cascade)
  objectId  String
  object    Object  @relation(fields: [objectId], references: [id], onDelete: Cascade)
  depth     Int     @default(0)
  isRotated Boolean @default(false)
  positionX Int     @default(0)
  positionY Int     @default(0)
}

enum ZoneEventTileType {
  BLOCK
  TELEPORT
  NPC
  ITEM
}

model ZoneEventTile {
  id        String                 @id @default(uuid())
  zoneId    Int
  zone      Zone                   @relation(fields: [zoneId], references: [id], onDelete: Cascade)
  type      ZoneEventTileType
  positionX Int
  positionY Int
  teleport  ZoneEventTileTeleport?
}

model ZoneEventTileTeleport {
  id              String        @id @default(uuid())
  zoneEventTileId String        @unique
  zoneEventTile   ZoneEventTile @relation(fields: [zoneEventTileId], references: [id], onDelete: Cascade)
  toZoneId        Int
  toZone          Zone          @relation(fields: [toZoneId], references: [id], onDelete: Cascade)
  toRotation      Int
  toPositionX     Int
  toPositionY     Int
}