generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
}

model AppConfig {
  id        String   @id @default(cuid())
  key       String   @unique
  value     String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

enum PortfolioSectionType {
  RICH_TEXT
  GALLERY
  STATS
  DELIVERABLES
  LINK
}

enum PortfolioAssetKind {
  IMAGE
  DOCUMENT
}

enum PortfolioProjectViewMode {
  GRID
  STORY
  CASE_STUDY
}

enum MediaSource {
  UPLOAD
  EXTERNAL
}

enum MediaKind {
  IMAGE
  DOCUMENT
}

enum MediaUsageType {
  PORTFOLIO_COVER
  PORTFOLIO_SECTION
  PORTFOLIO_ASSET
  GENERIC
}

model Category {
  id            String             @id @default(cuid())
  slug          String             @unique
  nameAr        String
  nameEn        String
  nameDe        String
  descriptionAr String
  descriptionEn String
  descriptionDe String
  sortOrder     Int                @default(0)
  isActive      Boolean            @default(true)
  createdAt     DateTime           @default(now())
  updatedAt     DateTime           @updatedAt
  projects      PortfolioProject[]
}

model PortfolioProject {
  id             String                   @id @default(cuid())
  categoryId     String
  slug           String                   @unique
  viewMode       PortfolioProjectViewMode @default(GRID)
  titleAr        String
  titleEn        String
  titleDe        String
  summaryAr      String
  summaryEn      String
  summaryDe      String
  clientName     String
  projectYear    Int
  serviceLabelAr String
  serviceLabelEn String
  serviceLabelDe String
  previewUrl     String?
  coverImagePath String?
  isFeatured     Boolean                  @default(false)
  isPublished    Boolean                  @default(false)
  publishedAt    DateTime?
  sortOrder      Int                      @default(0)
  createdAt      DateTime                 @default(now())
  updatedAt      DateTime                 @updatedAt
  category       Category                 @relation(fields: [categoryId], references: [id], onDelete: Restrict)
  sections       PortfolioSection[]
  assets         PortfolioAsset[]

  @@index([categoryId, isPublished, sortOrder])
  @@index([isPublished, sortOrder])
}

model PortfolioSection {
  id        String               @id @default(cuid())
  projectId String
  type      PortfolioSectionType
  titleAr   String
  titleEn   String
  titleDe   String
  bodyAr    String
  bodyEn    String
  bodyDe    String
  imagePath String?
  linkUrl   String?
  sortOrder Int                  @default(0)
  createdAt DateTime             @default(now())
  updatedAt DateTime             @updatedAt
  project   PortfolioProject     @relation(fields: [projectId], references: [id], onDelete: Cascade)

  @@index([projectId, sortOrder])
}

model PortfolioAsset {
  id        String             @id @default(cuid())
  projectId String
  kind      PortfolioAssetKind
  filePath  String
  altAr     String
  altEn     String
  altDe     String
  sortOrder Int                @default(0)
  createdAt DateTime           @default(now())
  updatedAt DateTime           @updatedAt
  project   PortfolioProject   @relation(fields: [projectId], references: [id], onDelete: Cascade)

  @@index([projectId, sortOrder])
}

model MediaAsset {
  id        String         @id @default(cuid())
  source    MediaSource
  kind      MediaKind
  url       String
  fileName  String
  label     String
  altText   String?
  mimeType  String?
  size      Int?
  createdAt DateTime       @default(now())
  updatedAt DateTime       @updatedAt
  usages    MediaUsage[]

  @@index([kind, createdAt])
}

model MediaUsage {
  id        String         @id @default(cuid())
  assetId    String
  usageType  MediaUsageType
  entityType String
  entityId   String
  fieldKey   String
  createdAt  DateTime       @default(now())
  updatedAt  DateTime       @updatedAt
  asset      MediaAsset     @relation(fields: [assetId], references: [id], onDelete: Cascade)

  @@unique([usageType, entityType, entityId, fieldKey])
  @@index([assetId])
  @@index([entityType, entityId])
}
