//
//  Database.swift
//  NotificationService
//
//  Created by Djorkaeff Alexandre Vilela Pereira on 9/14/20.
//  Copyright © 2020 Rocket.Chat. All rights reserved.
//

import Foundation
import WatermelonDB

final class Database {
  private final var database: WatermelonDB.Database? = nil

  private var directory: String? {
    if let suiteName = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as? String {
      if let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: suiteName) {
        return directory.path
      }
    }
    
    return nil
  }
  
  init(server: String) {
    if let url = URL(string: server) {
      if let domain = url.domain, let directory = directory {
        let isOfficial = Bundle.main.object(forInfoDictionaryKey: "IS_OFFICIAL") as? Bool ?? false
        self.database = WatermelonDB.Database(path: "\(directory)/\(domain)\(isOfficial ? "" : "-experimental").db")
      }
    }
  }
  
  func readRoomEncryptionKey(rid: String) -> String? {
    if let database = database {
      if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) {
        guard let record = results.next() else {
          return nil
        }
        
        if let room = record.resultDictionary as? [String: Any] {
          if let e2eKey = room["e2e_key"] as? String {
            return e2eKey
          }
        }
      }
    }
    
    return nil
  }
  
  func readRoomEncrypted(rid: String) -> Bool {
    if let database = database {
      if let results = try? database.queryRaw("select * from subscriptions where id == ? limit 1", [rid]) {
        guard let record = results.next() else {
          return false
        }
        
        if let room = record.resultDictionary as? [String: Any] {
          if let encrypted = room["encrypted"] as? Bool {
            return encrypted
          }
        }
      }
    }
    
    return false
  }
}