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

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model Project {
  id               Int       @id @default(autoincrement())
  slug             String    @unique @db.VarChar(255)
  title            String    @db.VarChar(255)
  subtitle         String?   @db.VarChar(255)
  description      String?
  year             Int
  client           String?   @db.VarChar(255)
  role             String?   @db.VarChar(255)
  featuredImage    String?   @db.VarChar(500)
  gallery          Json?
  externalUrl      String?   @db.VarChar(500)
  caseStudyContent Json?
  displayOrder     Int       @default(0)
  status           String    @default("draft") @db.VarChar(50)
  publishedAt      DateTime?
  createdAt        DateTime  @default(now())
  updatedAt        DateTime  @updatedAt
  backgroundColor  String?   @db.VarChar(50)
  highlightColor   String?   @db.VarChar(50)
  logoUrl          String?   @db.VarChar(500)
  password         String?   @db.VarChar(255)
  projectType      String    @default("work") @db.VarChar(50)

  @@index([slug])
  @@index([status])
}

model Post {
  id            Int       @id @default(autoincrement())
  slug          String    @unique @db.VarChar(255)
  postType      String    @db.VarChar(50)
  title         String?   @db.VarChar(255)
  content       Json?
  featuredImage String?   @db.VarChar(500)
  tags          Json?
  status        String    @default("draft") @db.VarChar(50)
  publishedAt   DateTime?
  createdAt     DateTime  @default(now())
  updatedAt     DateTime  @updatedAt
  attachments   Json?

  @@index([slug])
  @@index([status])
  @@index([postType])
}

model Album {
  id             Int           @id @default(autoincrement())
  slug           String        @unique @db.VarChar(255)
  title          String        @db.VarChar(255)
  description    String?
  date           DateTime?
  location       String?       @db.VarChar(255)
  coverPhotoId   Int?
  status         String        @default("draft") @db.VarChar(50)
  showInUniverse Boolean       @default(false)
  createdAt      DateTime      @default(now())
  updatedAt      DateTime      @updatedAt
  content        Json?
  publishedAt    DateTime?
  media          AlbumMedia[]
  geoLocations   GeoLocation[]

  @@index([slug])
  @@index([status])
}

model Photo {
  id            Int       @id @default(autoincrement())
  filename      String    @db.VarChar(255)
  url           String    @db.VarChar(500)
  thumbnailUrl  String?   @db.VarChar(500)
  width         Int?
  height        Int?
  exifData      Json?
  caption       String?
  displayOrder  Int       @default(0)
  slug          String?   @unique @db.VarChar(255)
  title         String?   @db.VarChar(255)
  description   String?
  status        String    @default("draft") @db.VarChar(50)
  publishedAt   DateTime?
  showInPhotos  Boolean   @default(true)
  createdAt     DateTime  @default(now())
  mediaId       Int?
  dominantColor String?   @db.VarChar(7)
  colors        Json?
  aspectRatio   Float?
  media         Media?    @relation(fields: [mediaId], references: [id])

  @@index([slug])
  @@index([status])
  @@index([mediaId])
}

model Media {
  id               Int          @id @default(autoincrement())
  filename         String       @db.VarChar(255)
  mimeType         String       @db.VarChar(100)
  size             Int
  url              String
  thumbnailUrl     String?
  width            Int?
  height           Int?
  usedIn           Json         @default("[]")
  createdAt        DateTime     @default(now())
  description      String?
  originalName     String?      @db.VarChar(255)
  updatedAt        DateTime     @updatedAt
  isPhotography    Boolean      @default(false)
  exifData         Json?
  photoCaption     String?
  photoTitle       String?      @db.VarChar(255)
  photoDescription String?
  photoSlug        String?      @unique @db.VarChar(255)
  photoPublishedAt DateTime?
  dominantColor    String?      @db.VarChar(7)
  colors           Json?
  aspectRatio      Float?
  albums           AlbumMedia[]
  usage            MediaUsage[]
  photos           Photo[]
}

model MediaUsage {
  id          Int      @id @default(autoincrement())
  mediaId     Int
  contentType String   @db.VarChar(50)
  contentId   Int
  fieldName   String   @db.VarChar(100)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  media       Media    @relation(fields: [mediaId], references: [id], onDelete: Cascade)

  @@unique([mediaId, contentType, contentId, fieldName])
  @@index([mediaId])
  @@index([contentType, contentId])
}

model AlbumMedia {
  id           Int      @id @default(autoincrement())
  albumId      Int
  mediaId      Int
  displayOrder Int      @default(0)
  createdAt    DateTime @default(now())
  album        Album    @relation(fields: [albumId], references: [id], onDelete: Cascade)
  media        Media    @relation(fields: [mediaId], references: [id], onDelete: Cascade)

  @@unique([albumId, mediaId])
  @@index([albumId])
  @@index([mediaId])
}

model GeoLocation {
  id          Int      @id @default(autoincrement())
  albumId     Int
  latitude    Float
  longitude   Float
  title       String   @db.VarChar(255)
  description String?
  markerColor String?  @db.VarChar(7)
  order       Int      @default(0)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  album       Album    @relation(fields: [albumId], references: [id], onDelete: Cascade)

  @@index([albumId])
}
