generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "debian-openssl-1.1.x"]
}

datasource db {
  provider = "postgresql"
  url      = "postgresql://ssbnkart_admin:ssbnkartadmin@localhost/ssbnkart_ssbndb"
}

// ====================== ENUMS ======================

// --- Enums ---

enum Role {
  USER
  ADMIN
  SUPPORT
}

enum OrderStatus {
  PENDING
  PROCESSING
  SHIPPED
  DELIVERED
  CANCELLED
  RETURNED
}

enum PaymentStatus {
  PENDING
  PAID
  FAILED
  REFUNDED
}

enum AddressType {
  HOME
  WORK
  OTHER
}

enum DiscountType {
  PERCENTAGE
  FIXED
}

// --- User & Auth (Compatible with NextAuth.js) ---

model User {
  id            String    @id @default(cuid())
  fullName      String?
  email         String    @unique
  emailVerified DateTime?
  image         String?
  password      String? // Hashed password
  phone         String?
  role          Role      @default(USER)
  refreshToken  String?
  // Profile Details
  gender        String?
  dob           DateTime?

  // Loyalty
  tier   String? @default("Silver")
  points Int?    @default(0)

  notifyOrder  Boolean? @default(true)
  notifyStock  Boolean? @default(true)
  notifyReview Boolean? @default(false)

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  // Relations
  accounts     Account[]
  sessions     Session[]
  addresses    Address[]
  orders       Order[]
  reviews      Review[]
  cart         Cart?
  wishlist     Wishlist?
  notification Notification[]
  supportLogs  SupportLog[]
  claimCoupons ClaimCoupon[]
}

model Notification {
  id        String   @id @default(uuid())
  userId    String?
  user      User?    @relation(fields: [userId], references: [id])
  title     String
  body      String
  read      Boolean  @default(false)
  meta      Json?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Account {
  id                String  @id @default(cuid())
  userId            String
  type              String
  provider          String
  providerAccountId String
  refresh_token     String? @db.Text
  access_token      String? @db.Text
  expires_at        Int?
  token_type        String?
  scope             String?
  id_token          String? @db.Text
  session_state     String?

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@unique([provider, providerAccountId])
}

model Session {
  id           String   @id @default(cuid())
  sessionToken String   @unique
  userId       String
  expires      DateTime
  user         User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Address {
  id        String      @id @default(cuid())
  userId    String
  type      AddressType @default(HOME)
  isDefault Boolean     @default(false)
  street    String
  city      String
  state     String
  zipCode   String
  country   String?
  email     String?
  fullName  String?
  phone     String
  user      User        @relation(fields: [userId], references: [id], onDelete: Cascade)
  orders    Order[]
}

// --- Product Catalog ---

model Category {
  id          String  @id @default(cuid())
  name        String // Like women,men,child
  slug        String  @unique
  image       String?
  description String?

  // Hierarchy (e.g., Women -> Ethnic -> Kurtas)
  parentId String?
  parent   Category?  @relation("CategoryHierarchy", fields: [parentId], references: [id])
  children Category[] @relation("CategoryHierarchy")

  products Product[]

  createdAt          DateTime           @default(now())
  featuredCategories FeaturedCategory[]
}

model Product {
  id          String  @id @default(cuid())
  name        String
  slug        String  @unique
  description String  @db.Text
  details     String? @db.Text // HTML or JSON for "Material & Care"

  // Images (Main image + Gallery)
  images String[]

  // Pricing
  price          Decimal  @db.Decimal(10, 2)
  compareAtPrice Decimal? @db.Decimal(10, 2) // Original price if on sale
  stock          Int?     @default(0)
  // Organization
  categoryId     String
  category       Category @relation(fields: [categoryId], references: [id])

  tags       String[] // e.g., ["Summer", "Handblock", "Indigo"]
  isFeatured Boolean  @default(false)
  isArchived Boolean  @default(false)

  // Relations
  variants      ProductVariant[]
  reviews       Review[]
  cartItems     CartItem[]
  wishlistItems WishlistItem[]

  createdAt           DateTime             @default(now())
  updatedAt           DateTime             @updatedAt
  featuredCollections FeaturedCollection[]
}

// Handles Size/Color combinations (SKUs)
model ProductVariant {
  id        String @id @default(cuid())
  productId String
  sku       String @unique

  // Attributes
  size  String // e.g., "S", "M", "L", "XL"
  color String // e.g., "Indigo", "Beige"

  // Inventory
  stock Int @default(0)

  // Variant specific pricing (optional, if XL costs more)
  priceDiff Decimal? @db.Decimal(10, 2)

  product    Product     @relation(fields: [productId], references: [id], onDelete: Cascade)
  cartItems  CartItem[]
  orderItems OrderItem[]

  @@unique([productId, size, color]) // Prevent duplicate variants
}

// --- Shopping ---

model Cart {
  id       String     @id @default(cuid())
  userId   String?    @unique
  user     User?      @relation(fields: [userId], references: [id], onDelete: Cascade)
  discount Decimal?   @db.Decimal(10, 2)
  items    CartItem[]

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model CartItem {
  id             String          @id @default(cuid())
  cartId         String
  productId      String
  variantId      String?
  quantity       Int
  cart           Cart            @relation(fields: [cartId], references: [id], onDelete: Cascade)
  product        Product         @relation(fields: [productId], references: [id])
  productVariant ProductVariant? @relation(fields: [variantId], references: [id])
}

model Wishlist {
  id String @id @default(cuid())

  userId String @unique
  user   User   @relation(fields: [userId], references: [id], onDelete: Cascade)

  items WishlistItem[]

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model WishlistItem {
  id         String @id @default(cuid())
  wishlistId String
  productId  String

  wishlist Wishlist @relation(fields: [wishlistId], references: [id], onDelete: Cascade)
  product  Product  @relation(fields: [productId], references: [id])

  addedAt DateTime @default(now())

  @@unique([wishlistId, productId])
}

// --- Orders & Checkout ---

model Order {
  id     String  @id @default(cuid())
  userId String? // Nullable for guest checkout
  user   User?   @relation(fields: [userId], references: [id])

  orderNumber String @unique // Readable ID e.g. FAB-88291

  status OrderStatus @default(PENDING)
  isPaid Boolean     @default(false)

  // Financials
  subtotal     Decimal  @db.Decimal(10, 2)
  discount     Decimal? @db.Decimal(10, 2)
  shippingCost Decimal  @db.Decimal(10, 2)
  tax          Decimal  @db.Decimal(10, 2)
  total        Decimal  @db.Decimal(10, 2)

  // Shipping Info
  addressId       String?
  shippingAddress Address? @relation(fields: [addressId], references: [id])
  trackingNumber  String?
  carrier         String?

  // Relations
  items   OrderItem[]
  payment Payment?

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model OrderItem {
  id      String @id @default(cuid())
  orderId String

  // We link to Variant to track what SKU was sold
  variantId String?
  variant   ProductVariant? @relation(fields: [variantId], references: [id])

  // SNAPSHOT DATA: Important! 
  // We copy product details here so if the Product is deleted later, 
  // the order history remains intact.
  productId    String? // Keep ref just in case, but optional constraint
  productName  String?
  productImage String?
  sku          String?
  size         String?
  color        String?

  price    Decimal @db.Decimal(10, 2) // Price at moment of purchase
  quantity Int

  order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
}

model Payment {
  id      String @id @default(cuid())
  orderId String @unique
  order   Order  @relation(fields: [orderId], references: [id])

  provider      String // e.g., "STRIPE", "RAZORPAY", "COD"
  transactionId String? // ID from the payment gateway
  status        PaymentStatus @default(PENDING)
  amount        Decimal       @db.Decimal(10, 2)

  createdAt DateTime @default(now())
}

// --- Social & Feedback ---

model Review {
  id        String   @id @default(cuid())
  rating    Int
  comment   String   @db.Text
  status    String   @default("Published") // Published, Flagged, Archived
  reply     String?  @db.Text // Admin response
  createdAt DateTime @default(now())

  userId String
  user   User   @relation(fields: [userId], references: [id])

  productId String
  product   Product @relation(fields: [productId], references: [id])
}

// Add this to your existing schema
model SupportLog {
  id      String   @id @default(cuid())
  userId  String
  adminId String?
  subject String
  body    String   @db.Text
  status  String   @default("SENT")
  sentAt  DateTime @default(now())

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model Campaign {
  id        String    @id @default(cuid())
  subject   String
  body      String    @db.Text
  audience  String // 'ALL', 'NEWSLETTER', 'VIP', 'ABANDONED'
  status    String // 'SENT', 'DRAFT'
  sentCount Int       @default(0)
  createdAt DateTime  @default(now())
  sentAt    DateTime?
}

model Announcement {
  id        String   @id @default(cuid())
  text      String
  isActive  Boolean  @default(true)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Banner {
  id         String   @id @default(cuid())
  title      String
  image      String // URL to the image
  link       String // Where the banner clicks to
  buttonText String? // Optional text for the CTA button (e.g., "Shop Now")
  active     Boolean  @default(true)
  order      Int      @default(0) // For sorting
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
}

model StoreSettings {
  id           String   @id @default("store_config")
  storeName    String   @default("SSBN")
  supportEmail String   @default("support@ssbnkart.com")
  taxRate      Decimal  @default(18.0) @db.Decimal(5, 2)
  freeShipping Int?     @default(0)
  updatedAt    DateTime @updatedAt
}

model FeaturedCollection {
  id     String  @id @default(cuid())
  title  String // Custom label like "Editor's Pick" or "Trending Now"
  order  Int     @default(0)
  active Boolean @default(true)

  // Relation to Product
  productId String
  product   Product @relation(fields: [productId], references: [id], onDelete: Cascade)

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

// Represents an item in the Bento Grid on the homepage
model FeaturedCategory {
  id String @id @default(cuid())

  // Custom Display Options
  customImage String? // Optional: Override category image
  size        String  @default("small") // 'large', 'medium', 'small'
  order       Int     @default(0)
  active      Boolean @default(true)

  // Relation
  categoryId String
  category   Category @relation(fields: [categoryId], references: [id], onDelete: Cascade)

  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

// Featured Banner
model FeaturedBanner {
  id          String   @id @default(cuid())
  image       String
  title       String
  description String
  cta         String
  link        String
  createdAt   DateTime @default(now())
}


// coupon 
model Coupon {
  id          String  @id @default(cuid())
  code        String  @unique
  description String?

  discountType  DiscountType
  discountValue Int // % OR fixed amount

  minOrderAmount Int?
  maxDiscount    Int?

  usageLimit Int?
  usedCount  Int  @default(0)

  validFrom DateTime
  validTill DateTime

  isActive Boolean @default(true)

  createdAt    DateTime      @default(now())
  updatedAt    DateTime      @updatedAt
  claimCoupons ClaimCoupon[]
}

model ClaimCoupon {
  id String @id @default(cuid())

  userId   String
  couponId String

  user   User   @relation(fields: [userId], references: [id], onDelete: Cascade)
  coupon Coupon @relation(fields: [couponId], references: [id], onDelete: Cascade)

  claimedAt DateTime @default(now())

  @@unique([userId, couponId])
}

// Content Management System for Homepage Sections
model HeritageStory {
  id          String @id @default(cuid())
  tagline     String // e.g., "The Philosophy"
  title       String // e.g., "Celebrating India's Artisanal Legacy"
  description String @db.Text
  imageUrl    String // URL from Cloudinary/S3
  buttonText  String @default("Read Our Story")
  buttonLink  String @default("/about")

  isActive  Boolean  @default(true)
  updatedAt DateTime @updatedAt
}
