// Prisma Schema for Ukulima Rentals Multi-Tenant SaaS
datasource db {
  provider = "postgresql" // Or "mysql"
  url      = env("DATABASE_URL")
}

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

enum Role {
  SUPER_ADMIN
  LANDLORD_AGENCY
  CARETAKER
  TENANT
}

model User {
  id            String    @id @default(uuid())
  email         String    @unique
  passwordHash  String
  name          String
  phone         String?
  role          Role      @default(TENANT)
  landlordId    String?
  createdAt     DateTime  @default(now())
}

model LandlordConfig {
  id                String    @id @default(uuid())
  landlordId        String    @unique
  agencyName        String
  landlordCode      String    @unique
  contactEmail      String
  contactPhone      String
  invoicePrefix     String    @default("INV-")
  // M-Pesa Daraja
  mpesaShortcode    String?
  mpesaConsumerKey  String?
  mpesaConsumerSec  String?
  mpesaPasskey      String?
  mpesaEnvironment  String    @default("sandbox")
  mpesaCallbackUrl  String?
  // Paystack
  paystackPublicKey String?
  paystackSecretKey String?
  // Custom SMS Gateway
  smsProvider       String    @default("africas_talking")
  smsApiEndpoint    String?
  smsApiKey         String?
  smsSenderId       String?
  smsTemplateReminder String?
  properties        Property[]
}

model Property {
  id                  String   @id @default(uuid())
  landlordId          String
  landlord            LandlordConfig @relation(fields: [landlordId], references: [landlordId])
  name                String
  address             String
  city                String   @default("Nairobi")
  neighborhood        String
  totalUnits          Int      @default(1)
  assignedCaretakerId String?
  imageUrl            String?
  amenities           String[]
  units               Unit[]
  createdAt           DateTime @default(now())
}

model Unit {
  id                  String   @id @default(uuid())
  propertyId          String
  property            Property @relation(fields: [propertyId], references: [id])
  landlordId          String
  unitNumber          String
  unitType            String
  monthlyRent         Float
  securityDeposit     Float
  waterRatePerUnit    Float    @default(180)
  isOccupied          Boolean  @default(false)
  currentTenantId     String?
  isListedForHunting  Boolean  @default(false)
  listingHeadline     String?
  listingDescription  String?
  imageUrl            String?
  availableFrom       String?
  createdAt           DateTime @default(now())
}

model TenantProfile {
  id              String   @id @default(uuid())
  landlordId      String
  landlordCode    String   // Credential 1
  unitReference   String   // Credential 2
  phoneNumber     String   // Credential 3
  tempSecurityPin String   // Credential 4
  fullName        String
  email           String
  idNumber        String
  leaseStartDate  DateTime
  leaseEndDate    DateTime?
  unitId          String
  propertyId      String
  rentAmount      Float
  depositPaid     Float
  status          String   @default("ACTIVE")
  createdAt       DateTime @default(now())
  invoices        PaymentInvoice[]
}

model PaymentInvoice {
  id                  String   @id @default(uuid())
  invoiceNumber       String   @unique
  tenantId            String
  tenant              TenantProfile @relation(fields: [tenantId], references: [id])
  landlordId          String
  unitId              String
  propertyId          String
  month               String
  rentAmount          Float
  waterBill           Float    @default(0)
  electricityBill     Float    @default(0)
  garbageFee          Float    @default(500)
  totalAmount         Float
  amountPaid          Float    @default(0)
  balanceDue          Float
  status              String   @default("PENDING")
  paymentToken        String   @unique
  dueDate             DateTime
  paidAt              DateTime?
  paymentMethod       String?
  transactionReference String?
  createdAt           DateTime @default(now())
}
