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

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

// 1. Admins Table
model Admin {
  id        String   @id @default(uuid())
  name      String
  email     String   @unique
  password  String
  role      String   @default("admin") // admin, superadmin
  status    Boolean  @default(true)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt

  @@map("admins")
}

// 2. Products Table
model Product {
  id                 String           @id @default(uuid())
  name               String
  slug               String           @unique
  envatoItemId       String           @unique @map("envato_item_id")
  currentVersion     String           @default("1.0.0") @map("current_version")
  techStack          String           @map("tech_stack") // Laravel, MERN, Flutter, etc.
  status             Boolean          @default(true)
  runtimeValidation  Boolean          @default(true) @map("runtime_validation")
  heartbeatEnabled   Boolean          @default(true) @map("heartbeat_enabled")
  licenses           License[]
  productVersions    ProductVersion[]
  createdAt          DateTime         @default(now())
  updatedAt          DateTime         @updatedAt

  @@map("products")
}

// 3. Licenses Table
model License {
  id              String           @id @default(uuid())
  purchaseCode    String           @unique @map("purchase_code")
  productId       String           @map("product_id")
  buyerEmail      String?          @map("buyer_email")
  buyerUsername   String?          @map("buyer_username")
  licenseType     String           @default("regular") @map("license_type")
  status          String           @default("active") // active, suspended, blocked
  activationLimit Int              @default(1) @map("activation_limit")
  supportedUntil  DateTime?        @map("supported_until")
  product         Product          @relation(fields: [productId], references: [id])
  activations     Activation[]
  logs            LicenseLog[]
  createdAt       DateTime         @default(now())
  updatedAt       DateTime         @updatedAt

  @@index([purchaseCode])
  @@map("licenses")
}

// 4. Activations Table (Binds license to domain)
model Activation {
  id            String   @id @default(uuid())
  licenseId     String   @map("license_id")
  domain        String
  ipAddress     String?  @map("ip_address")
  licenseToken  String   @unique @map("license_token")
  installationId String   @unique @map("installation_id")
  status        Boolean  @default(true)
  lastHeartbeat DateTime @default(now()) @map("last_heartbeat")
  license       License  @relation(fields: [licenseId], references: [id])
  createdAt     DateTime @default(now())
  updatedAt     DateTime @updatedAt

  @@index([domain, licenseToken])
  @@map("activations")
}

// 5. License Logs Table
model LicenseLog {
  id        String   @id @default(uuid())
  licenseId String?  @map("license_id")
  action    String   // verify, check, heartbeat, failed_verify
  domain    String?
  ipAddress String?  @map("ip_address")
  message   String   @db.Text
  details   Json?
  license   License? @relation(fields: [licenseId], references: [id])
  createdAt DateTime @default(now())

  @@map("license_logs")
}

// 6. Blocked Domains Table
model BlockedDomain {
  id        String   @id @default(uuid())
  domain    String   @unique
  reason    String?
  createdAt DateTime @default(now())

  @@map("blocked_domains")
}

// 7. Blocked IPs Table
model BlockedIp {
  id        String   @id @default(uuid())
  ipAddress String   @unique @map("ip_address")
  reason    String?
  createdAt DateTime @default(now())

  @@map("blocked_ips")
}

// 8. API Keys (For external integrations)
model ApiKey {
  id        String   @id @default(uuid())
  key       String   @unique
  name      String
  status    Boolean  @default(true)
  createdAt DateTime @default(now())

  @@map("api_keys")
}

// 9. Heartbeat Logs
model HeartbeatLog {
  id             String   @id @default(uuid())
  installationId String   @map("installation_id")
  domain         String
  ipAddress      String?  @map("ip_address")
  status         String   // success, failure
  createdAt      DateTime @default(now())

  @@map("heartbeat_logs")
}

// 10. Product Versions Table
model ProductVersion {
  id          String   @id @default(uuid())
  productId   String   @map("product_id")
  version     String
  changelog   String?  @db.Text
  downloadUrl String?  @map("download_url")
  product     Product  @relation(fields: [productId], references: [id])
  createdAt   DateTime @default(now())

  @@map("product_versions")
}

// 11. System Settings
model SystemSetting {
  id    String @id @default(uuid())
  key   String @unique
  value String
  @@map("system_settings")
}
