generator client {
  provider   = "prisma-client-js"
  output     = "./generated/game"
  engineType = "binary"
}

datasource db {
  provider = "postgresql"
}

enum LogScope {
  SYSTEM
  NATION
  GENERAL
  USER
}

enum LogCategory {
  HISTORY
  SUMMARY
  ACTION
  BATTLE_BRIEF
  BATTLE_DETAIL
  USER
}

enum AuctionStatus {
  OPEN
  FINALIZING
  FINISHED
  CANCELED

  @@map("auction_status")
}

enum AuctionType {
  BUY_RICE
  SELL_RICE
  UNIQUE_ITEM

  @@map("auction_type")
}

enum DiplomacyLetterState {
  PROPOSED
  ACTIVATED
  CANCELLED
  REPLACED

  @@map("diplomacy_letter_state")
}

enum InputEventStatus {
  PENDING
  PROCESSING
  SUCCEEDED
  FAILED
}

enum InputEventTarget {
  API
  ENGINE
}

model InputEvent {
  sequence     BigInt           @id @default(autoincrement())
  requestId    String           @unique @map("request_id")
  target       InputEventTarget
  eventType    String           @map("event_type")
  payload      Json             @default(dbgenerated("'{}'::jsonb"))
  actorUserId  String?          @map("actor_user_id")
  status       InputEventStatus @default(PENDING)
  result       Json?
  error        String?
  attempts     Int              @default(0)
  lockedBy     String?          @map("locked_by")
  leaseUntil   DateTime?        @map("lease_until")
  createdAt    DateTime         @default(now()) @map("created_at")
  processingAt DateTime?        @map("processing_at")
  completedAt  DateTime?        @map("completed_at")

  @@index([target, status, sequence])
  @@map("input_event")
}

model ReadModelRevision {
  domain    String
  entityId  Int      @default(0) @map("entity_id")
  revision  BigInt   @default(0)
  updatedAt DateTime @updatedAt @map("updated_at")

  @@id([domain, entityId])
  @@map("read_model_revision")
}

model ReadModelOutbox {
  id          BigInt    @id @default(autoincrement())
  payload     Json
  attempts    Int       @default(0)
  availableAt DateTime  @default(now()) @map("available_at")
  lockedAt    DateTime? @map("locked_at")
  lockOwner   String?   @map("lock_owner")
  deliveredAt DateTime? @map("delivered_at")
  lastError   String?   @map("last_error")
  createdAt   DateTime  @default(now()) @map("created_at")

  @@index([deliveredAt, availableAt, id], map: "read_model_outbox_delivered_at_available_at_id_idx")
  @@map("read_model_outbox")
}

model ReadModelRevisionMeta {
  id              Int @id
  coverageVersion Int @default(0) @map("coverage_version")

  @@map("read_model_revision_meta")
}

model TurnDaemonLease {
  profile      String   @id
  ownerId      String   @map("owner_id")
  leaseUntil   DateTime @map("lease_until")
  fencingEpoch BigInt   @default(1) @map("fencing_epoch")
  heartbeatAt  DateTime @default(now()) @map("heartbeat_at")

  @@map("turn_daemon_lease")
}

model WorldState {
  id              Int       @id @default(autoincrement())
  scenarioCode    String    @map("scenario_code")
  currentYear     Int       @map("current_year")
  currentMonth    Int       @map("current_month")
  tickSeconds     Int       @map("tick_seconds")
  clockBaseTime   DateTime? @map("clock_base_time")
  clockTick       BigInt?   @map("clock_tick")
  clockMode       String    @default("realtime") @map("clock_mode")
  clockWallAnchor DateTime? @map("clock_wall_anchor")
  lastTurnTick    BigInt?   @map("last_turn_tick")
  config          Json      @default(dbgenerated("'{}'::jsonb"))
  meta            Json      @default(dbgenerated("'{}'::jsonb"))
  updatedAt       DateTime  @updatedAt @map("updated_at")

  trafficPeriods TrafficPeriod[]

  @@map("world_state")
}

model Nation {
  id             Int    @id
  name           String
  color          String
  capitalCityId  Int?   @map("capital_city_id")
  chiefGeneralId Int?   @map("chief_general_id")
  gold           Int    @default(0)
  rice           Int    @default(0)
  tech           Float  @default(0)
  level          Int    @default(0)
  typeCode       String @default("che_중립") @map("type_code")
  meta           Json   @default(dbgenerated("'{}'::jsonb"))

  @@map("nation")
}

model City {
  id             Int    @id
  name           String
  level          Int
  nationId       Int    @default(0) @map("nation_id")
  supplyState    Int    @default(1) @map("supply_state")
  frontState     Int    @default(0) @map("front_state")
  population     Int    @map("pop")
  populationMax  Int    @map("pop_max")
  agriculture    Int    @map("agri")
  agricultureMax Int    @map("agri_max")
  commerce       Int    @map("comm")
  commerceMax    Int    @map("comm_max")
  security       Int    @map("secu")
  securityMax    Int    @map("secu_max")
  trust          Float  @default(0) @db.Real
  trade          Int?   @default(100)
  defence        Int    @map("def")
  defenceMax     Int    @map("def_max")
  wall           Int    @map("wall")
  wallMax        Int    @map("wall_max")
  region         Int
  conflict       Json   @default(dbgenerated("'{}'::jsonb"))
  meta           Json   @default(dbgenerated("'{}'::jsonb"))

  @@map("city")
}

model General {
  id            Int       @id
  userId        String?   @unique(map: "general_user_id_key") @map("user_id")
  name          String
  nationId      Int       @default(0) @map("nation_id")
  cityId        Int       @default(0) @map("city_id")
  troopId       Int       @default(0) @map("troop_id")
  npcState      Int       @default(0) @map("npc_state")
  affinity      Int?
  bornYear      Int       @default(180) @map("born_year")
  deadYear      Int       @default(300) @map("dead_year")
  picture       String?
  imageServer   Int       @default(0) @map("image_server")
  leadership    Int       @default(50)
  strength      Int       @default(50)
  intel         Int       @default(50)
  injury        Int       @default(0)
  experience    Int       @default(0)
  dedication    Int       @default(0)
  officerLevel  Int       @default(0) @map("officer_level")
  gold          Int       @default(1000)
  rice          Int       @default(1000)
  crew          Int       @default(0)
  crewTypeId    Int       @default(0) @map("crew_type_id")
  train         Int       @default(0)
  atmos         Int       @default(0)
  weaponCode    String    @default("None") @map("weapon_code")
  bookCode      String    @default("None") @map("book_code")
  horseCode     String    @default("None") @map("horse_code")
  itemCode      String    @default("None") @map("item_code")
  turnTime      DateTime  @map("turn_time")
  turnTick      BigInt?   @map("turn_tick")
  recentWarTime DateTime? @map("recent_war_time")
  recentWarTick BigInt?   @map("recent_war_tick")
  age           Int       @default(20)
  startAge      Int       @default(20) @map("start_age")
  personalCode  String    @default("None") @map("personal_code")
  specialCode   String    @default("None") @map("special_code")
  special2Code  String    @default("None") @map("special2_code")
  lastTurn      Json      @default(dbgenerated("'{}'::jsonb")) @map("last_turn")
  meta          Json      @default(dbgenerated("'{}'::jsonb"))
  penalty       Json      @default(dbgenerated("'{}'::jsonb"))
  createdAt     DateTime  @default(now()) @map("created_at")
  updatedAt     DateTime  @default(now()) @map("updated_at")

  @@map("general")
}

model SelectPoolEntry {
  id                Int       @id @default(autoincrement())
  uniqueName        String    @unique @map("unique_name") @db.VarChar(20)
  ownerUserId       String?   @map("owner_user_id")
  generalId         Int?      @unique @map("general_id")
  reservedUntil     DateTime? @map("reserved_until")
  reservedUntilTick BigInt?   @map("reserved_until_tick")
  info              Json

  @@index([ownerUserId])
  @@index([reservedUntil, generalId])
  @@map("select_pool")
}

model NpcSelectionToken {
  ownerUserId      String   @id @map("owner_user_id")
  validUntil       DateTime @map("valid_until")
  validUntilTick   BigInt?  @map("valid_until_tick")
  pickMoreFrom     DateTime @map("pick_more_from")
  pickMoreFromTick BigInt?  @map("pick_more_from_tick")
  pickResult       Json     @map("pick_result")
  nonce            Int
  createdAt        DateTime @default(now()) @map("created_at")
  updatedAt        DateTime @updatedAt @map("updated_at")

  @@index([validUntil])
  @@map("select_npc_token")
}

model GeneralAccessLog {
  id                Int       @id @default(autoincrement())
  generalId         Int       @unique @map("general_id")
  userId            String?   @map("user_id")
  lastRefresh       DateTime? @map("last_refresh")
  lastActionAt      DateTime? @map("last_action_at")
  refresh           Int       @default(0)
  refreshTotal      Int       @default(0) @map("refresh_total")
  refreshScore      Int       @default(0) @map("refresh_score")
  refreshScoreTotal Int       @default(0) @map("refresh_score_total")

  @@index([userId])
  @@index([lastActionAt])
  @@map("general_access_log")
}

model GeneralAccessBatch {
  id        String   @id @db.VarChar(64)
  createdAt DateTime @default(now()) @map("created_at")

  @@index([createdAt])
  @@map("general_access_batch")
}

model TrafficPeriod {
  id           Int      @id @default(autoincrement())
  worldStateId Int      @map("world_state_id")
  year         Int
  month        Int
  startedAt    DateTime @map("started_at")
  lastRefresh  DateTime @map("last_refresh")
  refresh      Int      @default(0)
  online       Int      @default(0)

  worldState WorldState             @relation(fields: [worldStateId], references: [id], onDelete: Cascade)
  generals   TrafficPeriodGeneral[]

  @@unique([worldStateId, year, month])
  @@index([worldStateId, startedAt])
  @@map("traffic_period")
}

model TrafficPeriodGeneral {
  periodId    Int      @map("period_id")
  generalId   Int      @map("general_id")
  userId      String?  @map("user_id")
  refresh     Int      @default(0)
  lastRefresh DateTime @map("last_refresh")

  period TrafficPeriod @relation(fields: [periodId], references: [id], onDelete: Cascade)

  @@id([periodId, generalId])
  @@index([periodId, refresh, generalId])
  @@map("traffic_period_general")
}

model MessageReadState {
  generalId              Int      @id @map("general_id")
  latestPrivateMessage   Int      @default(0) @map("latest_private_message")
  latestDiplomacyMessage Int      @default(0) @map("latest_diplomacy_message")
  updatedAt              DateTime @updatedAt @map("updated_at")

  @@map("message_read_state")
}

model Message {
  id             Int      @id @default(autoincrement())
  mailbox        Int
  type           String
  src            Int
  dest           Int
  time           DateTime
  timeTick       BigInt?  @map("time_tick")
  validUntil     DateTime @map("valid_until")
  validUntilTick BigInt?  @map("valid_until_tick")
  message        Json

  @@map("message")
}

model RankData {
  id        Int    @id @default(autoincrement())
  nationId  Int    @default(0) @map("nation_id")
  generalId Int    @map("general_id")
  type      String @db.VarChar(20)
  value     Int    @default(0)

  @@unique([generalId, type])
  @@index([type, value], name: "by_type")
  @@index([nationId, type, value], name: "by_nation")
  @@map("rank_data")
}

model HallOfFame {
  id        Int     @id @default(autoincrement())
  serverId  String  @map("server_id")
  season    Int
  scenario  Int
  generalNo Int     @map("general_no")
  type      String  @db.VarChar(20)
  value     Float
  owner     String? @map("owner")
  aux       Json    @default(dbgenerated("'{}'::jsonb"))

  @@unique([serverId, type, generalNo])
  @@unique([owner, serverId, type], name: "hall_owner")
  @@index([serverId, type, value], name: "server_show")
  @@index([season, scenario, type, value], name: "scenario")
  @@map("hall")
}

enum GameHistoryStatus {
  OPEN
  COMPLETED
  ABANDONED
}

enum GameCancellationHistoryMode {
  RETAIN_ABANDONED
  DELETE
}

enum GameCancellationGeneralMode {
  RETAIN
  DELETE
}

model GameHistory {
  id           Int               @id @default(autoincrement())
  serverId     String            @map("server_id")
  date         DateTime
  winnerNation Int?              @map("winner_nation")
  map          String?           @map("map")
  season       Int
  scenario     Int
  scenarioName String            @map("scenario_name")
  status       GameHistoryStatus @default(OPEN)
  env          Json              @default(dbgenerated("'{}'::jsonb"))

  @@unique([serverId])
  @@index([date])
  @@map("ng_games")
}

model GameInheritanceBaseline {
  serverId     String   @map("server_id")
  userId       String   @map("user_id")
  openingPoint Float    @map("opening_point")
  source       String   @default("OPENING")
  createdAt    DateTime @default(now()) @map("created_at")
  updatedAt    DateTime @updatedAt @map("updated_at")

  @@id([serverId, userId])
  @@index([userId, createdAt])
  @@map("game_inheritance_baseline")
}

model GameCancellation {
  id                          String                      @id
  serverId                    String                      @unique @map("server_id")
  originalSeason              Int                         @map("original_season")
  scenario                    Int
  scenarioName                String                      @map("scenario_name")
  openedAt                    DateTime                    @map("opened_at")
  cancelledAt                 DateTime                    @map("cancelled_at")
  cancelledBy                 String                      @map("cancelled_by")
  reason                      String
  historyMode                 GameCancellationHistoryMode @map("history_mode")
  generalMode                 GameCancellationGeneralMode @map("general_mode")
  earnedPointRetentionPercent Int                         @map("earned_point_retention_percent")
  participantCount            Int                         @map("participant_count")
  preservedGeneralCount       Int                         @map("preserved_general_count")
  settlement                  Json                        @default(dbgenerated("'{}'::jsonb"))
  createdAt                   DateTime                    @default(now()) @map("created_at")

  @@index([cancelledAt])
  @@map("game_cancellation")
}

model OldNation {
  id       Int      @id @default(autoincrement())
  serverId String   @map("server_id")
  nation   Int      @default(0)
  sourceId Int      @default(0) @map("source_id")
  data     Json     @default(dbgenerated("'{}'::jsonb"))
  date     DateTime @default(now())

  @@unique([serverId, nation, sourceId])
  @@index([serverId, nation], name: "by_server")
  @@map("ng_old_nations")
}

model OldGeneral {
  id            Int      @id @default(autoincrement())
  serverId      String   @map("server_id")
  generalNo     Int      @map("general_no")
  owner         String?  @map("owner")
  name          String
  lastYearMonth Int      @map("last_yearmonth")
  turnTime      DateTime @map("turntime")
  data          Json     @default(dbgenerated("'{}'::jsonb"))

  @@unique([serverId, generalNo], name: "by_no")
  @@index([serverId, name], name: "by_name")
  @@index([owner, serverId], name: "owner")
  @@map("ng_old_generals")
}

model Emperor {
  id           Int     @id @default(autoincrement()) @map("no")
  legacyId     Int?    @unique @map("legacy_id")
  serverId     String? @map("server_id")
  phase        String? @default("")
  nationCount  String? @map("nation_count")
  nationName   String? @map("nation_name")
  nationHist   String? @map("nation_hist")
  genCount     String? @map("gen_count")
  personalHist String? @map("personal_hist")
  specialHist  String? @map("special_hist")
  name         String? @default("")
  type         String? @default("")
  color        String? @default("")
  year         Int?    @default(0)
  month        Int?    @default(0)
  power        Int?    @default(0)
  gennum       Int?    @default(0)
  citynum      Int?    @default(0)
  pop          String? @default("0")
  poprate      String? @default("")
  gold         Int?    @default(0)
  rice         Int?    @default(0)
  l12name      String? @default("")
  l12pic       String? @default("")
  l11name      String? @default("")
  l11pic       String? @default("")
  l10name      String? @default("")
  l10pic       String? @default("")
  l9name       String? @default("")
  l9pic        String? @default("")
  l8name       String? @default("")
  l8pic        String? @default("")
  l7name       String? @default("")
  l7pic        String? @default("")
  l6name       String? @default("")
  l6pic        String? @default("")
  l5name       String? @default("")
  l5pic        String? @default("")
  tiger        String? @default("")
  eagle        String? @default("")
  gen          String? @default("")
  history      Json    @default(dbgenerated("'{}'::jsonb"))
  aux          Json    @default(dbgenerated("'{}'::jsonb"))

  @@map("emperior")
}

model UnificationFinalization {
  generationKey String   @id @map("generation_key")
  serverId      String   @unique @map("server_id")
  profileName   String   @map("profile_name")
  winnerNation  Int      @map("winner_nation")
  year          Int
  month         Int
  completedAt   DateTime @map("completed_at")
  createdAt     DateTime @default(now()) @map("created_at")

  @@map("unification_finalization")
}

model Troop {
  troopLeaderId Int    @id @map("troop_leader")
  nationId      Int    @map("nation")
  name          String

  @@map("troop")
}

model GeneralTurn {
  id         Int      @id @default(autoincrement())
  generalId  Int      @map("general_id")
  turnIdx    Int      @map("turn_idx")
  actionCode String   @map("action_code")
  arg        Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt  DateTime @default(now()) @map("created_at")

  @@unique([generalId, turnIdx])
  @@map("general_turn")
}

model GeneralTurnRevision {
  generalId      Int       @id @map("general_id")
  revision       Int       @default(0)
  leaseOwner     String?   @map("lease_owner")
  leaseExpiresAt DateTime? @map("lease_expires_at")
  updatedAt      DateTime  @updatedAt @map("updated_at")

  @@map("general_turn_revision")
}

model NationTurn {
  id           Int      @id @default(autoincrement())
  nationId     Int      @map("nation_id")
  officerLevel Int      @map("officer_level")
  turnIdx      Int      @map("turn_idx")
  actionCode   String   @map("action_code")
  arg          Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt    DateTime @default(now()) @map("created_at")

  @@unique([nationId, officerLevel, turnIdx])
  @@map("nation_turn")
}

model NationTurnRevision {
  nationId       Int       @map("nation_id")
  officerLevel   Int       @map("officer_level")
  revision       Int       @default(0)
  leaseOwner     String?   @map("lease_owner")
  leaseExpiresAt DateTime? @map("lease_expires_at")
  updatedAt      DateTime  @updatedAt @map("updated_at")

  @@id([nationId, officerLevel])
  @@map("nation_turn_revision")
}

model Diplomacy {
  id           Int      @id @default(autoincrement())
  srcNationId  Int      @map("src_nation_id")
  destNationId Int      @map("dest_nation_id")
  stateCode    Int      @map("state_code")
  term         Int      @default(0)
  isDead       Boolean  @default(false) @map("is_dead")
  isShowing    Boolean  @default(true) @map("is_showing")
  meta         Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt    DateTime @default(now()) @map("created_at")

  @@unique([srcNationId, destNationId])
  @@map("diplomacy")
}

model DiplomacyLetter {
  id           Int                  @id @default(autoincrement())
  srcNationId  Int                  @map("src_nation_id")
  destNationId Int                  @map("dest_nation_id")
  prevId       Int?                 @map("prev_id")
  state        DiplomacyLetterState @default(PROPOSED)
  textBrief    String               @map("text_brief")
  textDetail   String               @map("text_detail")
  date         DateTime             @default(now()) @map("date")
  srcSignerId  Int                  @map("src_signer")
  destSignerId Int?                 @map("dest_signer")
  aux          Json                 @default(dbgenerated("'{}'::jsonb"))

  @@index([srcNationId, destNationId])
  @@index([destNationId, srcNationId])
  @@index([state, date])
  @@map("diplomacy_letter")
}

model YearbookHistory {
  id            Int      @id @default(autoincrement())
  profileName   String   @map("profile_name")
  sourceId      Int      @default(0) @map("source_id")
  year          Int
  month         Int
  map           Json
  nations       Json
  globalHistory Json     @default(dbgenerated("'[]'::jsonb")) @map("global_history")
  globalAction  Json     @default(dbgenerated("'[]'::jsonb")) @map("global_action")
  hash          String   @default("")
  createdAt     DateTime @default(now()) @map("created_at")

  @@unique([profileName, year, month, sourceId])
  @@index([profileName, year, month])
  @@map("yearbook_history")
}

model Event {
  id         Int      @id @default(autoincrement())
  targetCode String   @map("target_code")
  priority   Int      @default(0)
  condition  Json     @default(dbgenerated("'{}'::jsonb"))
  action     Json     @default(dbgenerated("'{}'::jsonb"))
  meta       Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt  DateTime @default(now()) @map("created_at")

  @@map("event")
}

model LogEntry {
  id        Int         @id @default(autoincrement())
  scope     LogScope
  category  LogCategory
  subType   String?     @map("sub_type")
  year      Int
  month     Int
  text      String
  generalId Int?        @map("general_id")
  nationId  Int?        @map("nation_id")
  userId    Int?        @map("user_id")
  meta      Json        @default(dbgenerated("'{}'::jsonb"))
  createdAt DateTime    @default(now()) @map("created_at")

  @@index([scope, category, id])
  @@index([generalId, category, id])
  @@index([nationId, category, id])
  @@index([userId, category, id])
  @@map("log_entry")
}

model ErrorLog {
  id        Int      @id @default(autoincrement())
  category  String
  source    String?  @map("source")
  message   String
  trace     String?
  context   Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt DateTime @default(now()) @map("created_at")

  @@index([category, id])
  @@map("error_log")
}

model InheritancePoint {
  id        Int      @id @default(autoincrement())
  userId    String   @map("user_id")
  key       String
  value     Float    @default(0)
  aux       Json     @default(dbgenerated("'{}'::jsonb"))
  updatedAt DateTime @updatedAt @map("updated_at")

  @@unique([userId, key])
  @@index([userId])
  @@map("inheritance_point")
}

model NationBetting {
  id                       Int      @id
  type                     String   @default("bettingNation")
  name                     String
  finished                 Boolean  @default(false)
  selectCount              Int      @map("select_count")
  isExclusive              Boolean? @map("is_exclusive")
  requiresInheritancePoint Boolean  @default(true) @map("requires_inheritance_point")
  openYearMonth            Int      @map("open_year_month")
  closeYearMonth           Int      @map("close_year_month")
  candidates               Json
  winner                   Json?
  createdAt                DateTime @default(now()) @map("created_at")
  updatedAt                DateTime @updatedAt @map("updated_at")

  bets NationBet[]

  @@index([type, id])
  @@map("nation_betting")
}

model NationBet {
  id           Int      @id @default(autoincrement())
  bettingId    Int      @map("betting_id")
  generalId    Int      @map("general_id")
  userId       String?  @map("user_id")
  selection    Json
  selectionKey String   @map("selection_key")
  amount       Float
  createdAt    DateTime @default(now()) @map("created_at")
  updatedAt    DateTime @updatedAt @map("updated_at")

  betting NationBetting @relation(fields: [bettingId], references: [id], onDelete: Cascade)

  @@unique([bettingId, userId, selectionKey])
  @@index([bettingId])
  @@index([bettingId, userId])
  @@map("nation_bet")
}

model InheritanceLog {
  id        Int      @id @default(autoincrement())
  legacyId  Int?     @unique @map("legacy_id")
  userId    String   @map("user_id")
  serverId  String?  @map("server_id")
  logType   String   @default("inheritPoint") @map("log_type")
  year      Int
  month     Int
  text      String
  createdAt DateTime @default(now()) @map("created_at")

  @@index([userId, id])
  @@map("inheritance_log")
}

model InheritanceResult {
  id        Int      @id @default(autoincrement())
  legacyId  Int?     @unique @map("legacy_id")
  serverId  String   @map("server_id")
  owner     String   @map("owner")
  generalId Int      @map("general_id")
  year      Int
  month     Int
  value     Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt DateTime @default(now()) @map("created_at")

  @@index([serverId, owner])
  @@map("inheritance_result")
}

model Auction {
  id            Int           @id @default(autoincrement())
  type          AuctionType
  targetCode    String?       @map("target_code")
  hostGeneralId Int           @map("host_general_id")
  hostName      String?       @map("host_name")
  detail        Json          @default(dbgenerated("'{}'::jsonb"))
  status        AuctionStatus @default(OPEN)
  closeAt       DateTime      @map("close_at")
  openTick      BigInt?       @map("open_tick")
  closeTick     BigInt?       @map("close_tick")
  latestEventId String        @default("") @map("latest_event_id")
  latestEventAt DateTime      @default(now()) @map("latest_event_at")
  finalizingAt  DateTime?     @map("finalizing_at")
  finishedAt    DateTime?     @map("finished_at")
  createdAt     DateTime      @default(now()) @map("created_at")
  updatedAt     DateTime      @updatedAt @map("updated_at")

  bids AuctionBid[]

  @@index([status, closeAt])
  @@map("auction")
}

model AuctionBid {
  id        Int      @id @default(autoincrement())
  auctionId Int      @map("auction_id")
  generalId Int      @map("general_id")
  amount    Int
  eventId   String   @map("event_id")
  eventAt   DateTime @map("event_at")
  meta      Json     @default(dbgenerated("'{}'::jsonb"))
  createdAt DateTime @default(now()) @map("created_at")

  auction Auction @relation(fields: [auctionId], references: [id], onDelete: Cascade)

  @@index([auctionId, amount])
  @@index([auctionId, eventAt])
  @@map("auction_bid")
}

model InheritanceUserState {
  userId    String   @id @map("user_id")
  meta      Json     @default(dbgenerated("'{}'::jsonb"))
  updatedAt DateTime @updatedAt @map("updated_at")

  @@map("inheritance_user_state")
}

model LegacyGameStorage {
  id         Int      @id @default(autoincrement())
  sourceId   Int      @map("source_id")
  namespace  String
  key        String
  value      Json
  scope      String
  migratedAt DateTime @default(now()) @map("migrated_at")

  @@unique([sourceId])
  @@unique([namespace, key])
  @@index([scope, namespace])
  @@map("legacy_game_storage")
}

model BoardPost {
  id              Int      @id @default(autoincrement())
  nationId        Int      @map("nation_id")
  isSecret        Boolean  @default(false) @map("is_secret")
  authorGeneralId Int      @map("author_general_id")
  authorName      String   @map("author_name")
  title           String
  contentHtml     String   @map("content_html")
  createdAt       DateTime @default(now()) @map("created_at")
  updatedAt       DateTime @updatedAt @map("updated_at")

  comments BoardComment[]

  @@index([nationId, isSecret, createdAt])
  @@map("board_post")
}

model BoardComment {
  id              Int      @id @default(autoincrement())
  postId          Int      @map("post_id")
  nationId        Int      @map("nation_id")
  isSecret        Boolean  @default(false) @map("is_secret")
  authorGeneralId Int      @map("author_general_id")
  authorName      String   @map("author_name")
  contentText     String   @map("content_text")
  createdAt       DateTime @default(now()) @map("created_at")

  post BoardPost @relation(fields: [postId], references: [id], onDelete: Cascade)

  @@index([postId, createdAt])
  @@map("board_comment")
}

model VotePoll {
  id              Int       @id @default(autoincrement())
  title           String
  body            String    @default("")
  options         Json
  multipleOptions Int       @default(1) @map("multiple_options")
  revealMode      String    @map("reveal_mode")
  openerGeneralId Int       @map("opener_general_id")
  openerName      String    @map("opener_name")
  startAt         DateTime  @default(now()) @map("start_at")
  startTick       BigInt?   @map("start_tick")
  endAt           DateTime? @map("end_at")
  endTick         BigInt?   @map("end_tick")
  closedAt        DateTime? @map("closed_at")
  createdAt       DateTime  @default(now()) @map("created_at")
  updatedAt       DateTime  @updatedAt @map("updated_at")

  votes    Vote[]
  comments VoteComment[]

  @@map("vote_poll")
}

model Vote {
  id        Int      @id @default(autoincrement())
  voteId    Int      @map("vote_id")
  generalId Int      @map("general_id")
  nationId  Int      @map("nation_id")
  selection Json
  createdAt DateTime @default(now()) @map("created_at")

  poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade)

  @@unique([voteId, generalId])
  @@index([voteId])
  @@map("vote")
}

model VoteComment {
  id          Int      @id @default(autoincrement())
  voteId      Int      @map("vote_id")
  generalId   Int      @map("general_id")
  nationId    Int      @map("nation_id")
  generalName String   @map("general_name")
  nationName  String   @map("nation_name")
  text        String
  createdAt   DateTime @default(now()) @map("created_at")

  poll VotePoll @relation(fields: [voteId], references: [id], onDelete: Cascade)

  @@index([voteId, createdAt])
  @@map("vote_comment")
}
