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
}

enum AuctionType {
    BUY_RICE
    SELL_RICE
    UNIQUE_ITEM
}

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")
    config       Json     @default(dbgenerated("'{}'::jsonb"))
    meta         Json     @default(dbgenerated("'{}'::jsonb"))
    updatedAt    DateTime @updatedAt @map("updated_at")

    @@map("world_state")
}

model Nation {
    id            Int     @id
    name          String
    color         String
    capitalCityId Int?    @map("capital_city_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          Int  @default(0)
    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?  @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")
    recentWarTime DateTime? @map("recent_war_time")
    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 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 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 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 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 InheritanceLog {
    id        Int      @id @default(autoincrement())
    userId    String   @map("user_id")
    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())
    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")
    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")
}
