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

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

// ── MULTI-TENANT ──
model Tenant {
  id        Int         @id @default(autoincrement())
  name      String
  slug      String      @unique
  plan     TenantPlan  @default(FREE)
  isActive  Boolean    @default(true)
  users     User[]
  properties Property[]
  clients   Client[]
  tasks     Task[]
  reports   Report[]
  createdAt DateTime   @default(now())
  updatedAt DateTime   @updatedAt
}

enum TenantPlan {
  FREE
  PRO
  ENTERPRISE
}

// ── USUARIOS ──
model User {
  id           Int       @id @default(autoincrement())
  email        String    @unique
  password     String
  name         String
  phone        String?
  avatarUrl    String?
  role         UserRole  @default(AGENT)
  isActive     Boolean   @default(true)
  tenantId     Int
  tenant       Tenant    @relation(fields: [tenantId], references: [id])
  refreshToken String?
  tasks       Task[]
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
}

enum UserRole {
  ADMIN
  MANAGER
  AGENT
  OWNER
  VIEWER
}

// ── PROPIEDADES ──
model Property {
  id             Int              @id @default(autoincrement())
  title          String
  slug           String
  description    String?
  price          Float
  currency       Currency         @default(PEN)
  status         PropertyStatus  @default(AVAILABLE)
  type           PropertyType
  address        String?
  district       String?
  city           String?
  province       String?
  area           Float?
  bedrooms       Int?
  bathrooms      Int?
  parkingSpaces  Int?
  yearBuilt      Int?
  services       Json?
  amenities     Json?
  isPublished   Boolean         @default(false)
  ownerId        Int?
  tenantId      Int
  tenant        Tenant          @relation(fields: [tenantId], references: [id])
  images         PropertyImage[]
  plans          PropertyPlan[]
  documents      PropertyDocument[]
  createdAt     DateTime        @default(now())
  updatedAt     DateTime        @updatedAt
}

enum Currency {
  PEN
  USD
}

enum PropertyStatus {
  AVAILABLE
  RESERVED
  SOLD
  RENTED
  INACTIVE
}

enum PropertyType {
  HOUSE
  APARTMENT
  LAND
  OFFICE
  LOCAL
  WAREHOUSE
  BUILDING
}

// ── IMÁGENES ──
model PropertyImage {
  id         Int      @id @default(autoincrement())
  url        String
  filename  String
  isMain    Boolean  @default(false)
  order     Int      @default(0)
  propertyId Int
  property  Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
  createdAt  DateTime @default(now())
}

// ── PLANOS ──
model PropertyPlan {
  id         Int      @id @default(autoincrement())
  title     String
  url       String
  filename  String
  propertyId Int
  property  Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
  createdAt  DateTime @default(now())
}

// ── DOCUMENTOS ──
model PropertyDocument {
  id         Int            @id @default(autoincrement())
  name      String
  type     DocumentType
  url       String
  filename  String
  isRequired Boolean     @default(false)
  status   DocumentStatus @default(PENDING)
  propertyId Int
  property  Property      @relation(fields: [propertyId], references: [id], onDelete: Cascade)
  createdAt  DateTime     @default(now())
  updatedAt  DateTime     @updatedAt
}

enum DocumentType {
  TITLE_DEED
  TAX_RECEIPT
  HABITABILITY
  ENERGY_CERTIFICATE
  OWNERSHIP_CERTIFICATE
  CONTRACT
  OTHER
}

enum DocumentStatus {
  PENDING
  UPLOADED
  VERIFIED
  REJECTED
}

// ── CLIENTES ──
model Client {
  id            Int      @id @default(autoincrement())
  tipoIdentidad  String   // DNI / RUC
  nroIdentidad  String
  nombre       String
  direccion    String?
  telefono    String?
  email       String?
  notas       String?
  tenantId    Int
  tenant      Tenant   @relation(fields: [tenantId], references: [id])
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt

  @@unique([nroIdentidad, tenantId])
}

// ── TAREAS ──
model Task {
  id           Int         @id @default(autoincrement())
  title        String
  description  String?
  dueDate      DateTime?
  priority    TaskPriority @default(MEDIUM)
  isCompleted  Boolean     @default(false)
  completedAt  DateTime?
  userId       Int
  user         User        @relation(fields: [userId], references: [id])
  propertyId   Int?
  tenantId    Int
  tenant       Tenant     @relation(fields: [tenantId], references: [id])
  createdAt   DateTime   @default(now())
  updatedAt   DateTime   @updatedAt
}

enum TaskPriority {
  LOW
  MEDIUM
  HIGH
  URGENT
}

// ── REPORTES ──
model Report {
  id           Int       @id @default(autoincrement())
  title        String
  type        ReportType
  filters     Json?
  data        Json?
  tenantId    Int
  tenant      Tenant    @relation(fields: [tenantId], references: [id])
  createdAt   DateTime  @default(now())
}

enum ReportType {
  SALES
  INVENTORY
  CLIENTS
  TASKS
  CUSTOM
}