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

generator dbml {
  provider = "prisma-dbml-generator"
}

generator types {
  provider = "prisma-type-generator"
  output   = "../src/types"
}

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

model AIChatRoom {
  id                  String                @id @default(cuid())
  chatType            AIChatTypes           @default(supportive)
  createdAt           DateTime              @default(now())
  updatedAt           DateTime              @updatedAt
  chatCount           Int                   @default(0)
  userId              String
  users               users                 @relation(fields: [userId], references: [id])
  AIChatRoomMessaages AIChatRoomMessaages[]

  @@unique([userId, chatType])
  @@index([chatType])
  @@index([createdAt])
}

model AIChatRoomMessaages {
  id          String      @id @default(cuid())
  message     String
  messageType MessageType @default(AI)
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt
  userId      String
  chatRoom    String
  AIChatRoom  AIChatRoom  @relation(fields: [chatRoom], references: [id])
  users       users       @relation(fields: [userId], references: [id])

  @@index([createdAt])
  @@index([message])
}

model ContactSuport {
  id        String   @id @default(cuid())
  name      String
  email     String
  subject   String
  message   String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  userId    String
  users     users    @relation(fields: [userId], references: [id])

  @@index([createdAt])
  @@index([email])
  @@index([subject])
  @@index([message])
  @@index([name])
}

model RecentActions {
  id         String      @id @default(cuid())
  email      String?
  action     String
  createdAt  DateTime    @default(now())
  updatedAt  DateTime    @updatedAt
  actionType ActionTypes @default(LOGIN)
  userId     String
  users      users       @relation(fields: [userId], references: [id])

  @@index([email])
  @@index([action])
  @@index([actionType])
}

model Session {
  id         String   @id @default(cuid())
  token      String?
  expiresAt  DateTime @unique
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
  userId     String
  browser    String?
  deviceType String?
  ip         String?
  isRevoked  Boolean  @default(false)
  platform   String?
  userAgent  String?
  users      users    @relation(fields: [userId], references: [id])

  @@index([id])
}

model Subscriptions {
  id             String   @id @default(cuid())
  subscriptionId String
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt
  userId         String
  orderId        String
  productId      String
  startDate      DateTime
  status         String
  users          users    @relation(fields: [userId], references: [id])

  @@index([createdAt])
  @@index([subscriptionId])
}

model users {
  id                           String                         @id @default(cuid())
  email                        String?                        @unique
  password                     String
  createdAt                    DateTime                       @default(now())
  updatedAt                    DateTime                       @updatedAt
  image_id                     String?                        @unique
  is_active                    Boolean                        @default(true)
  is_deleted                   Boolean                        @default(false)
  is_profile_completed         Boolean                        @default(false)
  notification_on              Boolean                        @default(true)
  otp_id                       String?                        @unique
  user_type                    Role                           @default(USER)
  isSubscribe                  Boolean                        @default(false)
  is_verified                  Boolean                        @default(false)
  full_name                    String?
  subscriptionTier             TierTypeProps                  @default(FREE_TIER)
  AIChatRoom                   AIChatRoom[]
  AIChatRoomMessaages          AIChatRoomMessaages[]
  AstrologyCalculation         AstrologyCalculation[]
  AstrologyCalculationResponse AstrologyCalculationResponse[]
  AstrologyContent             AstrologyContent[]
  AstrologyInsight             AstrologyInsight[]
  AstrologyInsightContent      AstrologyInsightContent?
  ContactSuport                ContactSuport[]
  RecentActions                RecentActions[]
  Session                      Session[]
  Subscriptions                Subscriptions[]
  SystemPrompt                 SystemPrompt[]
  // admin_actions                admin_actions[]
  // ai_companion_sessions        ai_companion_sessions[]
  astrologyCharts              AstrologyChart[]
  // chat_messages                chat_messages[]
  DomesticViolenceReport       DomesticViolenceReport[]
  // meditation_sessions          meditation_sessions[]
  payments                     payments[]
  // spiritual_content            spiritual_content[]
  SubscriptionPlan             SubscriptionPlan[]
  // FileUpload                   FileUpload?                    @relation(fields: [image_id], references: [id])
  OpenAICostTracking           OpenAICostTracking[]

  @@index([user_type])
  @@index([email])
}

model AstrologyInsightContent {
  id              String   @id @default(cuid())
  userId          String   @unique
  currentInsights Json?
  personalAspects Json?
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt
  user            users    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([createdAt])
  @@index([updatedAt])
}

model OpenAICostTracking {
  id               String   @id @default(cuid())
  userId           String
  endpoint         String
  model            String
  chatType         String?
  promptTokens     Int
  completionTokens Int
  totalTokens      Int
  inputCost        Float
  outputCost       Float
  totalCost        Float
  isCached         Boolean  @default(false)
  requestDuration  Int? // in milliseconds
  createdAt        DateTime @default(now())
  user             users    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([endpoint])
  @@index([model])
  @@index([createdAt])
  @@index([totalCost])
  @@map("openai_cost_tracking")
}

model AstrologyChart {
  id                   String              @id @default(cuid())
  userId               String
  birthDate            DateTime
  birthTime            String?
  birthLocation        String
  latitude             Float?
  longitude            Float?
  timezone             String?
  sunSign              String
  moonSign             String?
  risingSign           String?
  chartInterpretation  String?
  astrologerNotes      String?
  isApproved           Boolean             @default(true)
  moderationNotes      String?
  moderatedBy          String?
  moderatedAt          DateTime?
  createdAt            DateTime            @default(now())
  updatedAt            DateTime            @updatedAt
  ascendantDescription String?
  moonDescription      String?
  sunDescription       String?
  user                 users               @relation(fields: [userId], references: [id], onDelete: Cascade)
  planetaryPositions   PlanetaryPosition[]

  @@map("astrology_charts")
}

model PlanetaryPosition {
  id           String         @id @default(cuid())
  chartId      String
  planet       String
  sign         String
  degree       Float
  house        Int?
  isRetrograde Boolean        @default(false)
  createdAt    DateTime       @default(now())
  updatedAt    DateTime       @updatedAt
  aspects      Aspect[]
  chart        AstrologyChart @relation(fields: [chartId], references: [id], onDelete: Cascade)

  @@map("planetary_positions")
}

model Aspect {
  id           String            @id @default(cuid())
  planetId     String
  targetPlanet String
  aspectType   AspectType
  orb          Float
  isExact      Boolean           @default(false)
  createdAt    DateTime          @default(now())
  updatedAt    DateTime          @updatedAt
  planet       PlanetaryPosition @relation(fields: [planetId], references: [id], onDelete: Cascade)

  @@map("aspects")
}

model DomesticViolenceReport {
  id            String     @id @default(cuid())
  createdAt     DateTime   @default(now())
  updatedAt     DateTime   @updatedAt
  incidentDate  DateTime
  incidentTime  String
  location      String
  description   String
  witnesses     String?
  policeReport  Boolean    @default(false)
  violenceTypes String[]
  notes         String?
  userId        String
  documents     Document[]
  user          users      @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@map("domestic_violence_reports")
}

model Document {
  id                 String                 @id @default(cuid())
  name               String
  uploadedAt         DateTime               @default(now())
  reportId           String
  lastModifiedDate   DateTime?
  size               Int?
  webkitRelativePath String?
  fileName           String
  filePath           String
  type               Int
  report             DomesticViolenceReport @relation(fields: [reportId], references: [id], onDelete: Cascade)

  @@map("documents")
}

// model SystemConfig {
//   id          String   @id @default(cuid())
//   key         String   @unique
//   value       String
//   description String?
//   isPublic    Boolean  @default(false)
//   createdAt   DateTime @default(now())
//   updatedAt   DateTime @updatedAt

//   @@map("system_config")
// }

model SubscriptionPlan {
  id             String   @id @default(cuid())
  name           String
  price          String
  period         String?
  product_id     String
  paypal_plan_id String?
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt
  userId         String
  orderId        String?
  user           users    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([createdAt])
  @@index([name])
  @@index([price])
  @@index([period])
  @@index([product_id])
  @@index([paypal_plan_id])
  @@map("subscription_plans")
}

model AstrologyContent {
  id          String         @id @default(cuid())
  planet      String
  Tags        String[]
  ZiodicSign  ZiodicSignEnum @default(AQUARIUS)
  createdAt   DateTime       @default(now())
  updatedAt   DateTime       @updatedAt
  userId      String
  description String?
  isDelete    Boolean        @default(false)
  Qualities   String[]
  user        users          @relation(fields: [userId], references: [id], onDelete: Cascade)
}

model AstrologyCalculation {
  id                 String         @id @default(cuid())
  createdAt          DateTime       @default(now())
  updatedAt          DateTime       @updatedAt
  date               String
  time               String
  timezone           String
  latitude           Float
  longitude          Float
  utc                String
  julianDayUT        Float
  sunLongitude       Float
  sunSign            ZiodicSignEnum
  sunDegree          Float
  sunFormatted       String
  moonLongitude      Float
  moonSign           ZiodicSignEnum
  moonDegree         Float
  moonFormatted      String
  ascendantLongitude Float
  ascendantSign      ZiodicSignEnum
  ascendantDegree    Float
  ascendantFormatted String
  note               String?
  userId             String
  isDeleted          Boolean        @default(false)
  user               users          @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([createdAt])
  @@index([userId, isDeleted])
  @@index([userId, isDeleted, createdAt])
  @@index([isDeleted, createdAt])
}

model AstrologyCalculationResponse {
  id                 String   @id @default(cuid())
  createdAt          DateTime @default(now())
  updatedAt          DateTime @updatedAt
  requestedDate      String
  requestedTime      String
  requestedTimezone  String
  requestedLatitude  Float
  requestedLongitude Float
  utc                String
  julianDayUT        Float
  sunLongitude       Float
  sunSign            String
  sunDegree          Float
  sunFormatted       String
  moonLongitude      Float
  moonSign           String
  moonDegree         Float
  moonFormatted      String
  ascendantLongitude Float
  ascendantSign      String
  ascendantDegree    Float
  ascendantFormatted String
  note               String?
  sunInfo            Json?
  moonInfo           Json?
  ascendantInfo      Json?
  userId             String
  isDeleted          Boolean  @default(false)
  user               users    @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([createdAt])
  @@index([sunSign])
  @@index([moonSign])
  @@index([ascendantSign])
}

model SystemPrompt {
  id          String      @id @default(cuid())
  chatTypes   AIChatTypes @default(supportive)
  description String
  createdAt   DateTime    @default(now())
  updatedAt   DateTime    @updatedAt
  userId      String
  user        users       @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([chatTypes])
  @@index([description])
  @@index([userId])
}

model AstrologyInsight {
  id                String      @id @default(cuid())
  createdAt         DateTime    @default(now())
  updatedAt         DateTime    @updatedAt
  userId            String
  insightType       InsightType
  weeklyTitle       String?
  weeklyPeriod      String?
  weeklyOverview    String?
  weeklyEnergy      String?
  weeklyKeyThemes   String[]
  weeklyLuckyDays   String[]
  weeklyChallenges  String?
  monthlyTitle      String?
  monthlyPeriod     String?
  monthlyOverview   String?
  monthlyEnergy     String?
  monthlyKeyThemes  String[]
  monthlyLuckyDays  String[]
  monthlyChallenges String?
  personalAspects   Json?
  generatedAt       DateTime    @default(now())
  expiresAt         DateTime
  isDeleted         Boolean     @default(false)
  user              users       @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([isDeleted])
  @@index([expiresAt])
  @@index([generatedAt])
  @@index([insightType])
}

// model Admin {
//   id                 String    @id
//   full_name          String?
//   email              String    @unique
//   password           String
//   two_factor_enabled Boolean   @default(false)
//   two_factor_secret  String?
//   last_login         DateTime?
//   created_at         DateTime  @default(now())
//   updated_at         DateTime

//   @@index([email])
// }

model Astrology {
  id         String         @id
  zioDicSign ZiodicSignEnum @default(GEMINI)
  createdAt  DateTime       @default(now())
  updatedAt  DateTime
}

// model Content {
//   id                 String       @id
//   contentType        ContentTypes @default(KEY_BENEFITS)
//   ContentTitle       String?
//   ContentImage       String?
//   ContentDescription String
//   createdAt          DateTime     @default(now())
//   updatedAt          DateTime

//   @@index([ContentTitle])
//   @@index([contentType])
// }

// model FileUpload {
//   id       String  @id
//   file     String?
//   fileType String?
//   users    users?
// }

model NewsLetter {
  id        String   @id
  name      String?
  email     String   @unique
  createdAt DateTime @default(now())
  updatedAt DateTime

  @@index([createdAt])
  @@index([email])
  @@index([name])
}

// model Testimonial {
//   id                String   @id
//   testimonial       String
//   testinomailAuthor String
//   testimonialType   String
//   createdAt         DateTime @default(now())
//   updatedAt         DateTime
// }

// model admin_actions {
//   id          String          @id
//   adminId     String
//   actionType  AdminActionType
//   targetType  String
//   targetId    String
//   description String
//   metadata    Json?
//   createdAt   DateTime        @default(now())
//   users       users           @relation(fields: [adminId], references: [id], onDelete: Cascade)
// }

// model ai_companion_sessions {
//   id            String          @id
//   userId        String
//   sessionName   String?
//   mode          String?
//   isActive      Boolean         @default(true)
//   startedAt     DateTime        @default(now())
//   endedAt       DateTime?
//   users         users           @relation(fields: [userId], references: [id], onDelete: Cascade)
//   chat_messages chat_messages[]
// }

// model chat_messages {
//   id                    String                 @id
//   userId                String
//   message               String
//   response              String?
//   isFromUser            Boolean
//   messageType           ChatMessageType        @default(TEXT)
//   metadata              Json?
//   createdAt             DateTime               @default(now())
//   aICompanionSessionId  String?
//   ai_companion_sessions ai_companion_sessions? @relation(fields: [aICompanionSessionId], references: [id])
//   users                 users                  @relation(fields: [userId], references: [id], onDelete: Cascade)
// }

// model house_cusps {
//   id               String         @id
//   chartId          String
//   houseNumber      Int
//   sign             String
//   degree           Float
//   createdAt        DateTime       @default(now())
//   updatedAt        DateTime
//   astrology_charts AstrologyChart @relation(fields: [chartId], references: [id], onDelete: Cascade)
// }

// model meditation_sessionai_companion_sessionss {
//   id          String    @id
//   userId      String
//   sessionType String
//   duration    Int
//   isCompleted Boolean   @default(false)
//   notes       String?
//   startedAt   DateTime  @default(now())
//   endedAt     DateTime?
//   users       users     @relation(fields: [userId], references: [id], onDelete: Cascade)
// }

model payments {
  id             String        @id @default(cuid())
  userId         String
  amount         Float
  currency       String        @default("USD")
  paymentMethod  String
  status         PaymentStatus @default(PENDING)
  transactionId  String?
  subscriptionId String?
  createdAt      DateTime      @default(now())
  updatedAt      DateTime      @updatedAt
  users          users         @relation(fields: [userId], references: [id], onDelete: Cascade)

  @@index([userId])
  @@index([status])
  @@index([transactionId])
}

// model spiritual_content {
//   id          String   @id
//   userId      String
//   title       String
//   content     String
//   contentType String
//   tags        String[]
//   isPublic    Boolean  @default(false)
//   isApproved  Boolean  @default(true)
//   createdAt   DateTime @default(now())
//   updatedAt   DateTime
//   users       users    @relation(fields: [userId], references: [id], onDelete: Cascade)
// }

enum AspectType {
  CONJUNCTION
  SEXTILE
  SQUARE
  TRINE
  OPPOSITION
  QUINCUNX
  SEMISEXTILE
  SEMISQUARE
}

enum AdminActionType {
  USER_APPROVED
  USER_SUSPENDED
  USER_DELETED
  CHART_APPROVED
  CHART_REJECTED
  CONTENT_MODERATED
  PAYMENT_REFUNDED
  SUBSCRIPTION_UPDATED
}

enum ChatMessageType {
  TEXT
  VOICE
  IMAGE
  FILE
}

enum PaymentStatus {
  PENDING
  COMPLETED
  FAILED
  REFUNDED
  CANCELLED
}

enum ReportStatus {
  SUBMITTED
  UNDER_REVIEW
  IN_PROGRESS
  RESOLVED
  CLOSED
  REJECTED
}

enum Priority {
  LOW
  MEDIUM
  HIGH
  URGENT
}

enum AIChatTypes {
  supportive
  analytics
  motivational
  girlfriend
  boyfriend
  emotional
  mental
  physical
}

enum ActionTypes {
  CHAT
  LOGIN
  LOGOUT
  SIGNUP
  CONTACT_SUPPORT
  ASTROLOGY_CHART
}

enum ContentTypes {
  KEY_BENEFITS
  PLATEFORM_HIGHLIGHTS
  HOWITWoRKS
  PROCESS_SIMPLIFIED
  FREQUENTLY_ASKED_QUESTION
  ADVANCED_EMOTIONAL
}

enum MessageType {
  ME
  AI
}

enum OTP_FOR {
  VERIFICATION
  FORGET_PASSWORD
  REGISTRATION
}

enum Role {
  USER
  ADMIN
  ALL
}

enum TierTypeProps {
  FREE_TIER
  HEALING
  THERAPY
}

enum ZiodicSignEnum {
  ARIES
  TAURUS
  GEMINI
  CANCER
  LEO
  VIRGO
  LIBRA
  SCORPIO
  SAGITTARIUS
  CAPRICORN
  AQUARIUS
  PISCES
  RISING
  VIRGUE
}

enum InsightType {
  WEEKLY
  MONTHLY
}
