// =======================
// DATABASE & GENERATOR
// =======================
datasource db {
  provider = "postgresql"          // PostgreSQL 사용
  url      = env("DATABASE_URL")   // 환경변수에서 DB 주소 불러옴
}

generator client {
  provider = "prisma-client-js"    // Prisma Client 생성
}

// ======================================================
// User (회원)
// - 서비스의 모든 기준이 되는 최상위 엔티티
// - 로그인/회원정보/포인트/알림/주문/교환에 모두 연결됨
// ======================================================
model User {
  id            String    @id @default(cuid())  
  /// PK — 회원 고유 ID (Prisma cuid 자동 생성)

  email         String    @unique
  /// 회원 이메일 (로그인 아이디), 중복 불가

  password      String
  /// 비밀번호 해시값 저장 (bcrypt 등으로 암호화하여 저장)

  nickname      String
  /// 닉네임 (서비스 내 표시 이름)

  points        Int?      @default(0)
  /// 보유 포인트 (판매 성공, 구매 취소, 이벤트 등에 사용 가능)

  refreshToken  String?
  /// JWT Refresh Token — 자동로그인 유지용 (옵션)

  createdAt     DateTime  @default(now())
  /// 회원 가입일 / 계정 생성일

  // -----------------------
  // Relations
  // -----------------------
  card          Card[]
  /// 사용자가 보유 중이고 등록한 모든 카드(상품)

  purchases     Order[]    @relation("Purchaser")
  /// 구매자로 참여한 모든 주문(Order)

  sales         Order[]    @relation("Seller")
  /// 판매자로 참여한 모든 주문(Order)

  exchanges     Exchange[]
  /// 자신이 요청한 모든 교환 기록

  history       History[]
  /// 활동 알림 / 기록
}

// ======================================================
// Card (포토카드 + 판매물)
// - 사용자 소유 카드이자 동시에 상품(판매 등록 가능)
// - 하나의 Card가 모든 흐름의 중심 (판매/교환/구매)
// ======================================================
model Card {
  id          String     @id @default(cuid())  
  /// PK — 카드 고유 ID

  ownerId     String
  owner       User       @relation(fields: [ownerId], references: [id])
  /// FK — 해당 카드를 소유한 사용자

  name        String
  /// 카드명 / 상품명 (예: 정국 포카, 카리나 셀카)

  imageUrl    String
  /// 카드 이미지 URL

  description String
  /// 카드 상세 설명 (상태, 특징, 흠집 여부 등)

  genre       String      
  /// 그룹 / 카테고리 (예: BTS / NEWJEANS / IVE)

  grade       String      
  /// 카드 등급 (예: S, A, B / 혹은 Normal, Rare 등)

  point       Int         
  /// 판매 또는 교환 시 기준 포인트(가격 개념)

  status      CardStatus  @default(OWNED)
  /// 카드의 현재 상태 (소유 / 판매중 / 예약중 / 판매됨 / 교환 제시중)

  createdAt   DateTime    @default(now())
  /// 카드 등록일

  // -----------------------
  // Relations
  // -----------------------
  orders      Order[]
  /// 해당 카드를 기반으로 발생한 모든 주문(구매/판매 기록)

  exchanges   Exchange[]
  /// 해당 카드를 기준으로 요청된 교환 기록
}

// 카드 상태 ENUM
enum CardStatus {
  OWNED        // 소유중
  LISTED       // 판매 등록됨
  RESERVED     // 거래 예약됨
  SOLD         // 판매됨
  EXCHANGE     // 교환 제시중
}

// ======================================================
// Order (구매/판매)
// - Card를 기반으로 만들어지는 실제 거래 정보
// - buyer, seller, card 모두 연결됨
// ======================================================
model Order {
  id            String       @id @default(cuid())  
  /// PK — 주문 고유 ID

  cardId        String
  card          Card         @relation(fields: [cardId], references: [id])
  /// FK — 어떤 카드를 거래하는가

  buyerId       String
  buyer         User         @relation("Purchaser", fields: [buyerId], references: [id])
  /// FK — 구매자

  sellerId      String
  seller        User         @relation("Seller", fields: [sellerId], references: [id])
  /// FK — 판매자 (= 카드 owner)

  status        OrderStatus  @default(PENDING)
  /// 주문 상태 (대기 → 성공/실패 → 완료)

  paymentMethod String?
  /// 결제 방식 (카드결제, 포인트결제 등)

  failureReason String?
  /// 결제 실패 시 사유 설명

  createdAt     DateTime     @default(now())
  /// 주문 생성일

  updatedAt     DateTime     @updatedAt
  /// 주문 정보 변경 시 자동 업데이트
}

// 주문 상태 ENUM
enum OrderStatus {
  PENDING      // 결제 대기 중
  PAID         // 결제 성공
  FAILED       // 결제 실패
  REFUNDED     // 환불됨
  COMPLETED    // 구매 완료
}

// ======================================================
// Exchange (교환 요청)
// - 특정 사용자가 특정 카드에 대해 교환을 요청하는 기록
// ======================================================
model Exchange {
  id             String      @id @default(cuid())  
  /// PK — 교환 요청 ID

  requesterId    String
  requester      User        @relation(fields: [requesterId], references: [id])
  /// FK — 교환 요청자

  cardId         String
  card           Card        @relation(fields: [cardId], references: [id])
  /// FK — 교환 요청의 대상이 되는 카드

  status         ExchangeStatus @default(PENDING)
  /// 교환 상태 (대기 → 수락/거절 → 완료)

  message        String?
  /// 교환 요청 시 전달하는 메시지 (옵션)

  createdAt      DateTime    @default(now())
  /// 요청 생성일

  updatedAt      DateTime    @updatedAt
  /// 상태 변경 등 정보 업데이트
}

// 교환 상태 ENUM
enum ExchangeStatus {
  PENDING
  ACCEPTED
  REJECTED
  COMPLETED
}

// ======================================================
// History (알림 / 사용자 활동 기록)
// ======================================================
model History {
  id        String    @id @default(cuid())  
  /// PK — 기록 고유 ID

  userId    String
  user      User      @relation(fields: [userId], references: [id])
  /// FK — 알림을 받는 사용자

  message   String
  /// 알림 내용 (예: “판매 등록 완료”, “교환 요청 받음”)

  isRead    Boolean   @default(false)
  /// 읽음 여부 (false = 안 읽음)

  createdAt DateTime  @default(now())
  /// 기록 생성일
}