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

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

enum Role {
  client
  contractor
  admin
}

enum FounderStatus {
  active
  pending
  expired
  not_applicable
}

enum RequestStatus {
  open
  quoted
  in_progress
  completed
  cancelled
}

enum InvoiceStatus {
  pending
  awaiting_confirmation
  paid
}

enum ListingType {
  auction
  buy_now
  both
}

enum ListingStatus {
  active
  ended
  sold
  cancelled
}

enum JobType {
  full_time
  part_time
  contract
}

enum JobStatus {
  active
  closed
}

enum ApplicantStatus {
  new
  reviewed
  interview
  hired
  rejected
}

enum OrderType {
  classified
  service
}

enum OrderStatus {
  pending_payment
  payment_submitted
  paid
  shipped
  completed
  disputed
  cancelled
}

enum DisputeStatus {
  open
  resolved
  closed
}

enum VerificationStatus {
  pending
  approved
  rejected
  in_review
}

enum TicketStatus {
  open
  in_progress
  closed
}

enum TicketPriority {
  low
  normal
  high
}

model User {
  id                 Int              @id @default(autoincrement())
  email              String           @unique
  passwordHash       String
  name               String
  role               Role             @default(client)
  isVerified         Boolean          @default(false)
  isFounder          Boolean          @default(false)
  founderStatus      FounderStatus    @default(not_applicable)
  tier               String           @default("regular")
  city               String           @default("")
  phone              String           @default("")
  avatar             String           @default("")
  verificationStatus VerificationStatus?
  contractorCategory String?
  createdAt          DateTime         @default(now())
  updatedAt          DateTime         @updatedAt

  contractorProfile  ContractorProfile?
  ownedRequests      ServiceRequest[]  @relation("RequestOwner")
  quotes             Quote[]
  listings           Listing[]         @relation("ListingSeller")
  bids               Bid[]
  postedJobs         Job[]             @relation("JobPoster")
  applications       JobApplication[]
  buyerOrders        Order[]           @relation("OrderBuyer")
  sellerOrders       Order[]           @relation("OrderSeller")
  reviews            Review[]          @relation("ReviewAuthor")
  verifications      Verification[]
  tickets            Ticket[]
  founder            Founder?
  openedDisputes     Dispute[]
  chatMessages       ChatMessage[]
}

model ContractorProfile {
  id           Int      @id @default(autoincrement())
  userId       Int      @unique
  name         String
  category     String
  rating       Float    @default(0)
  reviewsCount Int      @default(0)
  completed    Int      @default(0)
  image        String   @default("")
  verified     Boolean  @default(false)
  tier         String   @default("trial")
  city         String   @default("")
  lat          Float?
  lng          Float?
  responseTime Int      @default(30)
  bio          String   @default("")
  createdAt    DateTime @default(now())
  updatedAt    DateTime @updatedAt

  user         User            @relation(fields: [userId], references: [id], onDelete: Cascade)
  requests     ServiceRequest[] @relation("RequestContractor")
  quotes       Quote[]
  reviews      Review[]
}

model Category {
  id    Int    @id @default(autoincrement())
  name  String @unique
  emoji String @default("")
  bg    String @default("#0f766e")
  image String @default("")
}

model ServiceRequest {
  id            Int           @id @default(autoincrement())
  title         String
  category      String
  status        RequestStatus @default(open)
  date          DateTime      @default(now())
  image         String        @default("")
  address       String        @default("")
  budget        Float         @default(0)
  urgency       String        @default("normal")
  description   String
  ownerEmail    String
  ownerId       Int?
  contractorId  Int?
  signedAt      DateTime?
  signatureDataUrl String?
  invoiceStatus InvoiceStatus?
  completedAt   DateTime?
  orderId       Int?
  timeline      Json?
  createdAt     DateTime      @default(now())
  updatedAt     DateTime      @updatedAt

  owner         User?              @relation("RequestOwner", fields: [ownerId], references: [id])
  contractor    ContractorProfile? @relation("RequestContractor", fields: [contractorId], references: [id])
  quote         Quote?
  reviews       Review[]
}

model Quote {
  id               Int      @id @default(autoincrement())
  requestId        Int      @unique
  labor            Float    @default(0)
  materials        Float    @default(0)
  travel           Float    @default(0)
  tolls            Float    @default(0)
  notes            String   @default("")
  contractorId     Int?
  contractorEmail  String   @default("")
  contractorName   String   @default("")
  createdAt        DateTime @default(now())

  request          ServiceRequest     @relation(fields: [requestId], references: [id], onDelete: Cascade)
  contractor       ContractorProfile? @relation(fields: [contractorId], references: [id])
  user             User?              @relation(fields: [contractorUserId], references: [id])
  contractorUserId Int?
}

model Listing {
  id                 Int           @id @default(autoincrement())
  title              String
  category           String
  description        String
  image              String        @default("")
  images             Json?
  condition          String        @default("used")
  type               ListingType   @default(both)
  startPrice         Float
  currentBid         Float
  buyNowPrice        Float?
  minIncrement       Float         @default(10)
  city               String        @default("")
  sellerEmail        String
  sellerName         String
  sellerId           Int?
  endsAt             DateTime?
  status             ListingStatus @default(active)
  soldVia            String?
  buyerEmail         String?
  winnerEmail        String?
  winnerName         String?
  soldPrice          Float?
  orderId            Int?
  pendingWinnerEmail String?
  pendingWinnerName  String?
  pendingPrice       Float?
  createdAt          DateTime      @default(now())
  updatedAt          DateTime      @updatedAt

  seller             User?  @relation("ListingSeller", fields: [sellerId], references: [id])
  bids               Bid[]
  reviews            Review[]
}

model Bid {
  id        Int      @id @default(autoincrement())
  listingId Int
  userName  String
  email     String
  userId    Int?
  amount    Float
  at        DateTime @default(now())

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

model Job {
  id           Int       @id @default(autoincrement())
  title        String
  company      String
  category     String
  type         JobType   @default(full_time)
  city         String
  salary       String    @default("")
  description  String
  requirements String    @default("")
  posterEmail  String
  posterName   String
  posterId     Int?
  status       JobStatus @default(active)
  createdAt    DateTime  @default(now())
  updatedAt    DateTime  @updatedAt

  poster       User?            @relation("JobPoster", fields: [posterId], references: [id])
  applicants   JobApplication[]
}

model JobApplication {
  id           Int             @id @default(autoincrement())
  jobId        Int
  name         String
  email        String
  userId       Int?
  phone        String          @default("")
  city         String          @default("")
  experience   String          @default("")
  availability String          @default("")
  education    String          @default("")
  link         String          @default("")
  message      String          @default("")
  resumePath   String?
  resumeName   String?
  status       ApplicantStatus @default(new)
  at           DateTime        @default(now())

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

model Order {
  id              Int         @id @default(autoincrement())
  type            OrderType
  listingId       Int?
  requestId       Int?
  title           String
  image           String      @default("")
  buyerEmail      String
  buyerName       String
  buyerId         Int?
  sellerEmail     String
  sellerName      String      @default("")
  sellerId        Int?
  amount          Float
  platformFee     Float       @default(0)
  total           Float
  feePercent      Float       @default(0)
  paymentMethod   String      @default("transfer")
  status          OrderStatus @default(pending_payment)
  shippingMethod  String      @default("pickup")
  shippingAddress String      @default("")
  createdAt       DateTime    @default(now())
  paidAt          DateTime?
  shippedAt       DateTime?
  deliveredAt     DateTime?
  timeline        Json?

  buyer           User?     @relation("OrderBuyer", fields: [buyerId], references: [id])
  seller          User?     @relation("OrderSeller", fields: [sellerId], references: [id])
  dispute         Dispute?
  reviews         Review[]
}

model Dispute {
  id          Int           @id @default(autoincrement())
  orderId     Int           @unique
  title       String
  openerEmail String
  openerId    Int?
  status      DisputeStatus @default(open)
  createdAt   DateTime      @default(now())

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

model ChatThread {
  id        Int      @id @default(autoincrement())
  key       String   @unique
  kind      String   @default("service")
  title     String   @default("")
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  messages  ChatMessage[]
}

model ChatMessage {
  id        Int      @id @default(autoincrement())
  threadId  Int
  fromEmail String
  fromName  String   @default("")
  userId    Int?
  text      String
  alert     Boolean  @default(false)
  createdAt DateTime @default(now())

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

model Review {
  id               Int      @id @default(autoincrement())
  author           String
  authorId         Int?
  rating           Int
  date             DateTime @default(now())
  comment          String
  avatar           String   @default("")
  contractorId     Int?
  listingId        Int?
  orderId          Int?
  requestId        Int?
  verifiedPurchase Boolean  @default(false)

  authorUser       User?              @relation("ReviewAuthor", fields: [authorId], references: [id])
  contractor       ContractorProfile? @relation(fields: [contractorId], references: [id])
  listing          Listing?           @relation(fields: [listingId], references: [id])
  order            Order?             @relation(fields: [orderId], references: [id])
  request          ServiceRequest?    @relation(fields: [requestId], references: [id])
}

model Verification {
  id        Int                @id @default(autoincrement())
  name      String
  email     String
  userId    Int?
  role      Role
  docs      String             @default("")
  docMeta   Json?
  date      DateTime           @default(now())
  status    VerificationStatus @default(pending)

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

model Ticket {
  id        Int            @id @default(autoincrement())
  subject   String
  userName  String
  userId    Int?
  status    TicketStatus   @default(open)
  date      DateTime       @default(now())
  priority  TicketPriority @default(normal)
  notes     String         @default("")

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

model BillingIssue {
  id      Int          @id @default(autoincrement())
  invoice String
  amount  String
  issue   String
  status  TicketStatus @default(open)
}

model Founder {
  id       Int           @id @default(autoincrement())
  name     String
  role     String
  status   FounderStatus @default(pending)
  deadline String        @default("")
  email    String        @unique
  userId   Int?          @unique

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

model BlacklistEntry {
  id     Int      @id @default(autoincrement())
  email  String   @unique
  reason String
  date   DateTime @default(now())
  status String   @default("blocked")
}

model ActivityLog {
  id        Int      @id @default(autoincrement())
  type      String   @default("info")
  title     String
  detail    String   @default("")
  createdAt DateTime @default(now())
}

model PlatformSettings {
  id                     Int     @id @default(1)
  clientFeePercent       Float   @default(8)
  founderClientFeePercent Float  @default(4)
  contractorRetentionPercent Float @default(8)
  founderContractorRetentionPercent Float @default(3)
  contractorMonthlyFee   Float   @default(29.99)
  foundersLimit          Int     @default(1000)
  founderActivationDays  Int     @default(90)
  chatFilterEnabled      Boolean @default(true)
  requireVerification    Boolean @default(true)
  autoApproveListings    Boolean @default(true)
  maintenanceMode        Boolean @default(false)
  allowGuestBrowse       Boolean @default(true)
  supportEmail           String  @default("soporte@serviciospr.com")
  supportPhone           String  @default("(787) 555-0100")
  blockedKeywords        String  @default("")
  maxListingsPerUser     Int     @default(20)
  auctionDefaultDays     Int     @default(7)
  notifyAdminsOnTicket   Boolean @default(true)
  platformName           String  @default("Servicios PR")
  moduleServices         Boolean @default(true)
  moduleClassifieds      Boolean @default(true)
  moduleJobs             Boolean @default(true)
  jobPostRequireVerify   Boolean @default(true)
  maxJobsPerUser         Int     @default(10)
  foundersCount          Int     @default(247)
}

model Branding {
  id            Int    @id @default(1)
  brandName     String @default("Servicios PR")
  brandMark     String @default("s")
  accent        String @default("#C5FF00")
  bg            String @default("#0A0A0A")
  surface       String @default("#141814")
  effect        String @default("#C5FF00")
  border        String @default("#C5FF00")
  orb           String @default("#2A3B00")
  heroImage     String @default("https://images.unsplash.com/photo-1497366216548-37526070297c?w=1920&q=80")
  logoUrl       String @default("")
  documentTitle String @default("Servicios PR - Plataforma de Servicios Locales Verificados")
}

model SiteContent {
  id    Int    @id @default(autoincrement())
  key   String @unique
  value String
}
