import ExpoModulesCore

public class KeychainModule: Module {
  private let keyManager = SecureEnclaveKeyManager()

  public func definition() -> ModuleDefinition {
    Name("Keychain")

    AsyncFunction("isAvailable") { () -> Bool in
      self.keyManager.isAvailable()
    }

    AsyncFunction("hasKey") { (key: String) -> Bool in
      self.keyManager.hasKey(tag: key)
    }

    AsyncFunction("generateKeyPair") { (key: String) -> [String: String] in
      let publicKey = try self.keyManager.generateKeyPair(tag: key)
      return ["publicKey": publicKey]
    }

    AsyncFunction("getPublicKey") { (key: String) -> [String: String]? in
      guard let publicKey = try self.keyManager.getPublicKey(tag: key) else {
        return nil
      }
      return ["publicKey": publicKey]
    }

    AsyncFunction("sign") { (key: String, payload: String) -> [String: String] in
      let payloadData = try base64urlDecode(payload)
      let signature = try self.keyManager.sign(tag: key, payload: payloadData)
      return ["signature": signature]
    }

    AsyncFunction("deleteKey") { (key: String) in
      self.keyManager.deleteKey(tag: key)
    }
  }
}
