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

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

enum Role {
  ADMIN
  HR
  MANAGER
  EMPLOYEE
  GUEST
}

enum UserStatus {
  ACTIVE
  INACTIVE
  PENDING
  SUSPENDED
}

model User {
  id       String     @id @default(auto()) @map("_id") @db.ObjectId
  name     String
  email    String     @unique
  password String
  phone    String?
  avatar   String?    @default("https://media.naiya.ng/user/images/user-avatar.svg")    
  role     Role       @default(EMPLOYEE)
  status   UserStatus @default(ACTIVE)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  subsidiaryId String @db.ObjectId
  locationId   String @db.ObjectId

  subsidiary Subsidiary @relation(fields: [subsidiaryId], references: [id])
  location   Location   @relation(fields: [locationId], references: [id])

  groupMemberships GroupMember[]
  posts            Post[]         @relation("UserPosts")
  comments         Comment[]      @relation("UserComments")
  likes            Like[]         @relation("UserLikes")
  sentMessages     Message[]      @relation("SentMessages")
  receivedMessages Message[]      @relation("ReceivedMessages")
  groupMessages    GroupMessage[] @relation("UserGroupMessages")
  notifications    Notification[]
  eventsCreated    Event[]        @relation("UserEvents")
  messageReactions MessageReaction[]
  savedPosts       SavedPost[]
  newsCreated      News[]         // Relation for News created by this user
}

model Subsidiary {
  id          String  @id @default(auto()) @map("_id") @db.ObjectId
  name        String
  groupId     String? @db.ObjectId
  description String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  group     SubsidiaryGroup? @relation(fields: [groupId], references: [id])
  locations Location[]
  users     User[]
}

model SubsidiaryGroup {
  id           String       @id @default(auto()) @map("_id") @db.ObjectId
  name         String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  subsidiaries Subsidiary[]
}

model Location {
  id           String  @id @default(auto()) @map("_id") @db.ObjectId
  name         String
  address      String?
  subsidiaryId String  @db.ObjectId
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  subsidiary Subsidiary @relation(fields: [subsidiaryId], references: [id])
  users      User[]
}

model Post {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  content   String
  imageUrl  String?
  authorId  String   @db.ObjectId
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  author   User      @relation("UserPosts", fields: [authorId], references: [id])
  comments Comment[]
  likes    Like[]
  savedBy  SavedPost[]
}

model Comment {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  content   String
  postId    String   @db.ObjectId
  authorId  String   @db.ObjectId
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  post   Post @relation(fields: [postId], references: [id])
  author User @relation("UserComments", fields: [authorId], references: [id])
}

model Like {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  userId    String   @db.ObjectId
  postId    String   @db.ObjectId
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  user User @relation("UserLikes", fields: [userId], references: [id])
  post Post @relation(fields: [postId], references: [id])

  @@unique([userId, postId])
}

model Group {
  id          String         @id @default(auto()) @map("_id") @db.ObjectId
  name        String
  description String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  members     GroupMember[]
  messages    GroupMessage[]
}

model GroupMember {
  id       String   @id @default(auto()) @map("_id") @db.ObjectId
  groupId  String   @db.ObjectId
  userId   String   @db.ObjectId
  joinedAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  user  User  @relation(fields: [userId], references: [id])
  group Group @relation(fields: [groupId], references: [id])
}

model GroupMessage {
  id       String   @id @default(auto()) @map("_id") @db.ObjectId
  groupId  String   @db.ObjectId
  senderId String   @db.ObjectId
  content  String
  sentAt   DateTime @default(now())
  updatedAt DateTime @updatedAt

  group  Group @relation(fields: [groupId], references: [id])
  sender User  @relation("UserGroupMessages", fields: [senderId], references: [id])
}

model Notification {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  userId    String   @db.ObjectId
  title     String
  content   String
  read      Boolean  @default(false)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

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

model Event {
  id          String   @id @default(auto()) @map("_id") @db.ObjectId
  title       String
  description String
  date        DateTime
  time        String? // New: time of the event
  location    String?
  category    String? // Index in MongoDB for fast filtering
  attendees   Int? // New: expected attendees
  image       String? // New: event image
  featured    Boolean @default(false) // Index in MongoDB for fast filtering
  createdById String   @db.ObjectId
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  createdBy User @relation("UserEvents", fields: [createdById], references: [id])
}

model News {
  id          String   @id @default(auto()) @map("_id") @db.ObjectId
  title       String
  excerpt     String
  content     String
  author      String // Display author name
  date        DateTime
  category    String? // Index in MongoDB for fast filtering
  image       String?
  featured    Boolean @default(false) // Index in MongoDB for fast filtering
  createdById String   @db.ObjectId
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  createdBy User @relation(fields: [createdById], references: [id])
}

model Message {
  id         String   @id @default(auto()) @map("_id") @db.ObjectId
  content    String?
  type       String   @default("text") // text, image, video, audio, gif, reply, forward
  mediaUrl   String?
  mediaType  String?  // mime type
  mediaSize  Int?     // in bytes
  duration   Int?     // for video/audio in seconds
  thumbnailUrl String? // for video
  publicId   String?  // Cloudinary public ID
  senderId   String   @db.ObjectId
  receiverId String   @db.ObjectId
  sentAt     DateTime @default(now())
  read       Boolean  @default(false)
  isEdited   Boolean  @default(false)
  editedAt   DateTime?
  updatedAt DateTime @updatedAt
  forwardedFromId String? @db.ObjectId
  additionalMessage String? // For forwarded messages
  replyToId  String?   @db.ObjectId

  sender    User     @relation("SentMessages", fields: [senderId], references: [id])
  receiver  User     @relation("ReceivedMessages", fields: [receiverId], references: [id])
  forwardedFrom Message? @relation("ForwardedMessages", fields: [forwardedFromId], references: [id], onDelete: NoAction, onUpdate: NoAction)
  forwards  Message[] @relation("ForwardedMessages")
  reactions MessageReaction[]
  replies   Message[] @relation("Replies")
  replyTo   Message?  @relation("Replies", fields: [replyToId], references: [id], onDelete: NoAction, onUpdate: NoAction)
}

model MessageReaction {
  id           String   @id @default(auto()) @map("_id") @db.ObjectId
  messageId    String   @db.ObjectId
  userId       String   @db.ObjectId
  reactionType String   // like, love, haha, wow, sad, angry
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt

  message      Message  @relation(fields: [messageId], references: [id])
  user         User     @relation(fields: [userId], references: [id])

  @@unique([messageId, userId])
}

model SavedPost {
  id      String @id @default(auto()) @map("_id") @db.ObjectId
  userId  String @db.ObjectId
  postId  String @db.ObjectId
  savedAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  user User @relation(fields: [userId], references: [id])
  post Post @relation(fields: [postId], references: [id])

  @@unique([userId, postId])
}
