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

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

generator client {
  provider        = "prisma-client-js"
  binaryTargets   = ["debian-openssl-1.1.x", "native"]
  previewFeatures = ["orderByRelation", "selectRelationCount"]
}

model Access {
  createdAt     DateTime @default(now())
  GranteeUser   User     @relation(fields: [granteeUserId], name: "accessGet", references: [id])
  granteeUserId String
  id            String   @default(uuid())
  updatedAt     DateTime @updatedAt
  User          User     @relation(fields: [userId], name: "accessGive", references: [id])
  userId        String

  @@id([id, userId])
}

model Account {
  accountType AccountType @default(SECURITIES)
  balance     Float       @default(0)
  createdAt   DateTime    @default(now())
  currency    Currency    @default(USD)
  id          String      @default(uuid())
  isDefault   Boolean     @default(false)
  name        String?
  Order       Order[]
  Platform    Platform?   @relation(fields: [platformId], references: [id])
  platformId  String?
  updatedAt   DateTime    @updatedAt
  User        User        @relation(fields: [userId], references: [id])
  userId      String

  @@id([id, userId])
}

model Analytics {
  activityCount Int      @default(0)
  updatedAt     DateTime @updatedAt
  User          User     @relation(fields: [userId], references: [id])
  userId        String   @id
}

model AuthDevice {
  createdAt           DateTime @default(now())
  credentialId        Bytes
  credentialPublicKey Bytes
  counter             Int
  id                  String   @id @default(uuid())
  updatedAt           DateTime @updatedAt
  User                User     @relation(fields: [userId], references: [id])
  userId              String
}

model MarketData {
  createdAt   DateTime @default(now())
  date        DateTime
  id          String   @default(uuid())
  symbol      String
  marketPrice Float

  @@unique([date, symbol])
  @@index(fields: [symbol])
}

model Order {
  Account         Account?       @relation(fields: [accountId, accountUserId], references: [id, userId])
  accountId       String?
  accountUserId   String?
  createdAt       DateTime       @default(now())
  currency        Currency
  dataSource      DataSource     @default(YAHOO)
  date            DateTime
  fee             Float
  id              String         @default(uuid())
  isDraft         Boolean        @default(false)
  quantity        Float
  symbol          String
  SymbolProfile   SymbolProfile? @relation(fields: [symbolProfileId], references: [id])
  symbolProfileId String?
  type            Type
  unitPrice       Float
  updatedAt       DateTime       @updatedAt
  User            User           @relation(fields: [userId], references: [id])
  userId          String

  @@id([id, userId])
}

model Platform {
  Account Account[]
  id      String    @id @default(uuid())
  name    String?
  url     String    @unique
}

model Property {
  key   String @id
  value String
}

model Settings {
  currency  Currency?
  settings  Json?
  updatedAt DateTime  @updatedAt
  viewMode  ViewMode?
  User      User      @relation(fields: [userId], references: [id])
  userId    String    @id
}

model SymbolProfile {
  assetClass AssetClass?
  countries  Json?
  createdAt  DateTime    @default(now())
  currency   Currency?
  dataSource DataSource
  id         String      @id @default(uuid())
  name       String?
  Order      Order[]
  updatedAt  DateTime    @updatedAt
  sectors    Json?
  symbol     String

  @@unique([dataSource, symbol])
}

model Subscription {
  createdAt DateTime @default(now())
  expiresAt DateTime
  id        String   @default(uuid())
  updatedAt DateTime @updatedAt
  User      User     @relation(fields: [userId], references: [id])
  userId    String

  @@id([id, userId])
}

model User {
  Access        Access[]       @relation("accessGet")
  AccessGive    Access[]       @relation(name: "accessGive")
  accessToken   String?
  Account       Account[]
  alias         String?
  Analytics     Analytics?
  authChallenge String?
  AuthDevice    AuthDevice[]
  createdAt     DateTime       @default(now())
  id            String         @id @default(uuid())
  Order         Order[]
  provider      Provider?
  role          Role           @default(USER)
  Settings      Settings?
  Subscription  Subscription[]
  thirdPartyId  String?
  updatedAt     DateTime       @updatedAt
}

enum AccountType {
  CASH
  SECURITIES
}

enum AssetClass {
  CASH
  COMMODITY
  EQUITY
}

enum Currency {
  CHF
  EUR
  GBP
  USD
}

enum DataSource {
  ALPHA_VANTAGE
  GHOSTFOLIO
  RAKUTEN
  YAHOO
}

enum ViewMode {
  DEFAULT
  ZEN
}

enum Provider {
  ANONYMOUS
  GOOGLE
}

enum Role {
  ADMIN
  DEMO
  USER
}

enum Type {
  BUY
  SELL
}