// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client-js"
  output   = "./generated/prisma"
}

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

model User {
  id              String @id @default(cuid())
  username        String @unique
  name            String
  email           String @unique
  password        String
  lastLogin       DateTime?
  createdAt       DateTime @default(now())
  updatedAt       DateTime @updatedAt

  @@map("users")
}

model Site {
  id              Int @id @default(autoincrement())
  name            String
  description     String?
  networks        Network[]

  @@map("sites")
}

model Network {
  id              Int @id @default(autoincrement())
  site            Site @relation(fields: [siteId], references: [id], onDelete: Cascade)
  siteId           Int
  name            String
  ipv4Subnet      String?
  ipv6Subnet      String?
  gateway         String?
  servers         Server[]

  @@map("networks")
}

model Server {
  id              Int @id @default(autoincrement())
  network         Network @relation(fields: [networkId], references: [id], onDelete: Cascade)
  networkId       Int
  name            String
  description     String?
  icon            String?
  ipv4Address     String?
  osDetails       String?
  cpuDetails      String?
  gpuDetails      String?
  memoryDetails   String?
  storageDetails  String?
  managementUrl   String?
  monitoring      Boolean @default(false)
  monitoringUrl   String?
  monitoringData  ServerMonitoring[]
  applications    Application[]

  @@map("servers")
}

model ServerMonitoring {
  id              Int @id @default(autoincrement())
  server          Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
  serverId        Int
  cpuUsage        Float
  gpuUsage        Float
  memoryUsage     Float
  diskUsage       Float
  temperature     Float
  online          Boolean
  uptimeSeconds   Int
  timestamp       DateTime @default(now())

  @@index([serverId, timestamp])
  @@index([online])

  @@map("server_monitoring")
}

model Application {
  id              Int @id @default(autoincrement())
  server          Server @relation(fields: [serverId], references: [id], onDelete: Cascade)
  serverId        Int
  name            String
  description     String?
  icon            String?
  url             String?
  monitoring      Boolean @default(false)
  monitoringData  ApplicationMonitoring[]

  @@map("applications")
}

model ApplicationMonitoring {
  id              Int @id @default(autoincrement())
  application     Application @relation(fields: [applicationId], references: [id], onDelete: Cascade)
  applicationId   Int
  online          Boolean
  latency         Float
  timestamp       DateTime @default(now())

  @@index([applicationId, timestamp])
  @@index([online])

  @@map("application_monitoring")
}

model ServerMonitoringNotification {
  id              Int @id @default(autoincrement())
  statusChange    Boolean
  cpuLimit        Float
  gpuLimit        Float
  memoryLimit     Float
  diskLimit       Float
  temperatureLimit Float

  @@map("server_monitoring_notifications")
}

model ApplicationMonitoringNotification {
  id              Int @id @default(autoincrement())
  statusChange    Boolean
  latencyLimit    Float

  @@map("application_monitoring_notifications")
}

model NotificationProvider {
  id              Int @id @default(autoincrement())
  name            String
  type            NotificationType
  config          Json

  @@map("notification_providers")
}

enum NotificationType {
  TELEGRAM
}