// Autogenerated from Pigeon (v26.0.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon

import Foundation

#if os(iOS)
  import Flutter
#elseif os(macOS)
  import FlutterMacOS
#else
  #error("Unsupported platform.")
#endif

/// Error class for passing custom error details to Dart side.
final class PigeonError: Error {
  let code: String
  let message: String?
  let details: Sendable?

  init(code: String, message: String?, details: Sendable?) {
    self.code = code
    self.message = message
    self.details = details
  }

  var localizedDescription: String {
    return
      "PigeonError(code: \(code), message: \(message ?? "<nil>"), details: \(details ?? "<nil>")"
  }
}

private func wrapResult(_ result: Any?) -> [Any?] {
  return [result]
}

private func wrapError(_ error: Any) -> [Any?] {
  if let pigeonError = error as? PigeonError {
    return [
      pigeonError.code,
      pigeonError.message,
      pigeonError.details,
    ]
  }
  if let flutterError = error as? FlutterError {
    return [
      flutterError.code,
      flutterError.message,
      flutterError.details,
    ]
  }
  return [
    "\(error)",
    "\(type(of: error))",
    "Stacktrace: \(Thread.callStackSymbols)",
  ]
}

private func isNullish(_ value: Any?) -> Bool {
  return value is NSNull || value == nil
}

private func nilOrValue<T>(_ value: Any?) -> T? {
  if value is NSNull { return nil }
  return value as! T?
}

func deepEqualsMessages(_ lhs: Any?, _ rhs: Any?) -> Bool {
  let cleanLhs = nilOrValue(lhs) as Any?
  let cleanRhs = nilOrValue(rhs) as Any?
  switch (cleanLhs, cleanRhs) {
  case (nil, nil):
    return true

  case (nil, _), (_, nil):
    return false

  case is (Void, Void):
    return true

  case let (cleanLhsHashable, cleanRhsHashable) as (AnyHashable, AnyHashable):
    return cleanLhsHashable == cleanRhsHashable

  case let (cleanLhsArray, cleanRhsArray) as ([Any?], [Any?]):
    guard cleanLhsArray.count == cleanRhsArray.count else { return false }
    for (index, element) in cleanLhsArray.enumerated() {
      if !deepEqualsMessages(element, cleanRhsArray[index]) {
        return false
      }
    }
    return true

  case let (cleanLhsDictionary, cleanRhsDictionary) as ([AnyHashable: Any?], [AnyHashable: Any?]):
    guard cleanLhsDictionary.count == cleanRhsDictionary.count else { return false }
    for (key, cleanLhsValue) in cleanLhsDictionary {
      guard cleanRhsDictionary.index(forKey: key) != nil else { return false }
      if !deepEqualsMessages(cleanLhsValue, cleanRhsDictionary[key]!) {
        return false
      }
    }
    return true

  default:
    // Any other type shouldn't be able to be used with pigeon. File an issue if you find this to be untrue.
    return false
  }
}

func deepHashMessages(value: Any?, hasher: inout Hasher) {
  if let valueList = value as? [AnyHashable] {
     for item in valueList { deepHashMessages(value: item, hasher: &hasher) }
     return
  }

  if let valueDict = value as? [AnyHashable: AnyHashable] {
    for key in valueDict.keys { 
      hasher.combine(key)
      deepHashMessages(value: valueDict[key]!, hasher: &hasher)
    }
    return
  }

  if let hashableValue = value as? AnyHashable {
    hasher.combine(hashableValue.hashValue)
  }

  return hasher.combine(String(describing: value))
}

    

/// Generated class from Pigeon that represents data sent in messages.
struct PlatformAsset: Hashable {
  var id: String
  var name: String
  var type: Int64
  var createdAt: Int64? = nil
  var updatedAt: Int64? = nil
  var width: Int64? = nil
  var height: Int64? = nil
  var durationInSeconds: Int64
  var orientation: Int64
  var isFavorite: Bool


  // swift-format-ignore: AlwaysUseLowerCamelCase
  static func fromList(_ pigeonVar_list: [Any?]) -> PlatformAsset? {
    let id = pigeonVar_list[0] as! String
    let name = pigeonVar_list[1] as! String
    let type = pigeonVar_list[2] as! Int64
    let createdAt: Int64? = nilOrValue(pigeonVar_list[3])
    let updatedAt: Int64? = nilOrValue(pigeonVar_list[4])
    let width: Int64? = nilOrValue(pigeonVar_list[5])
    let height: Int64? = nilOrValue(pigeonVar_list[6])
    let durationInSeconds = pigeonVar_list[7] as! Int64
    let orientation = pigeonVar_list[8] as! Int64
    let isFavorite = pigeonVar_list[9] as! Bool

    return PlatformAsset(
      id: id,
      name: name,
      type: type,
      createdAt: createdAt,
      updatedAt: updatedAt,
      width: width,
      height: height,
      durationInSeconds: durationInSeconds,
      orientation: orientation,
      isFavorite: isFavorite
    )
  }
  func toList() -> [Any?] {
    return [
      id,
      name,
      type,
      createdAt,
      updatedAt,
      width,
      height,
      durationInSeconds,
      orientation,
      isFavorite,
    ]
  }
  static func == (lhs: PlatformAsset, rhs: PlatformAsset) -> Bool {
    return deepEqualsMessages(lhs.toList(), rhs.toList())  }
  func hash(into hasher: inout Hasher) {
    deepHashMessages(value: toList(), hasher: &hasher)
  }
}

/// Generated class from Pigeon that represents data sent in messages.
struct PlatformAlbum: Hashable {
  var id: String
  var name: String
  var updatedAt: Int64? = nil
  var isCloud: Bool
  var assetCount: Int64


  // swift-format-ignore: AlwaysUseLowerCamelCase
  static func fromList(_ pigeonVar_list: [Any?]) -> PlatformAlbum? {
    let id = pigeonVar_list[0] as! String
    let name = pigeonVar_list[1] as! String
    let updatedAt: Int64? = nilOrValue(pigeonVar_list[2])
    let isCloud = pigeonVar_list[3] as! Bool
    let assetCount = pigeonVar_list[4] as! Int64

    return PlatformAlbum(
      id: id,
      name: name,
      updatedAt: updatedAt,
      isCloud: isCloud,
      assetCount: assetCount
    )
  }
  func toList() -> [Any?] {
    return [
      id,
      name,
      updatedAt,
      isCloud,
      assetCount,
    ]
  }
  static func == (lhs: PlatformAlbum, rhs: PlatformAlbum) -> Bool {
    return deepEqualsMessages(lhs.toList(), rhs.toList())  }
  func hash(into hasher: inout Hasher) {
    deepHashMessages(value: toList(), hasher: &hasher)
  }
}

/// Generated class from Pigeon that represents data sent in messages.
struct SyncDelta: Hashable {
  var hasChanges: Bool
  var updates: [PlatformAsset]
  var deletes: [String]
  var assetAlbums: [String: [String]]


  // swift-format-ignore: AlwaysUseLowerCamelCase
  static func fromList(_ pigeonVar_list: [Any?]) -> SyncDelta? {
    let hasChanges = pigeonVar_list[0] as! Bool
    let updates = pigeonVar_list[1] as! [PlatformAsset]
    let deletes = pigeonVar_list[2] as! [String]
    let assetAlbums = pigeonVar_list[3] as! [String: [String]]

    return SyncDelta(
      hasChanges: hasChanges,
      updates: updates,
      deletes: deletes,
      assetAlbums: assetAlbums
    )
  }
  func toList() -> [Any?] {
    return [
      hasChanges,
      updates,
      deletes,
      assetAlbums,
    ]
  }
  static func == (lhs: SyncDelta, rhs: SyncDelta) -> Bool {
    return deepEqualsMessages(lhs.toList(), rhs.toList())  }
  func hash(into hasher: inout Hasher) {
    deepHashMessages(value: toList(), hasher: &hasher)
  }
}

private class MessagesPigeonCodecReader: FlutterStandardReader {
  override func readValue(ofType type: UInt8) -> Any? {
    switch type {
    case 129:
      return PlatformAsset.fromList(self.readValue() as! [Any?])
    case 130:
      return PlatformAlbum.fromList(self.readValue() as! [Any?])
    case 131:
      return SyncDelta.fromList(self.readValue() as! [Any?])
    default:
      return super.readValue(ofType: type)
    }
  }
}

private class MessagesPigeonCodecWriter: FlutterStandardWriter {
  override func writeValue(_ value: Any) {
    if let value = value as? PlatformAsset {
      super.writeByte(129)
      super.writeValue(value.toList())
    } else if let value = value as? PlatformAlbum {
      super.writeByte(130)
      super.writeValue(value.toList())
    } else if let value = value as? SyncDelta {
      super.writeByte(131)
      super.writeValue(value.toList())
    } else {
      super.writeValue(value)
    }
  }
}

private class MessagesPigeonCodecReaderWriter: FlutterStandardReaderWriter {
  override func reader(with data: Data) -> FlutterStandardReader {
    return MessagesPigeonCodecReader(data: data)
  }

  override func writer(with data: NSMutableData) -> FlutterStandardWriter {
    return MessagesPigeonCodecWriter(data: data)
  }
}

class MessagesPigeonCodec: FlutterStandardMessageCodec, @unchecked Sendable {
  static let shared = MessagesPigeonCodec(readerWriter: MessagesPigeonCodecReaderWriter())
}

/// Generated protocol from Pigeon that represents a handler of messages from Flutter.
protocol NativeSyncApi {
  func shouldFullSync() throws -> Bool
  func getMediaChanges() throws -> SyncDelta
  func checkpointSync() throws
  func clearSyncCheckpoint() throws
  func getAssetIdsForAlbum(albumId: String) throws -> [String]
  func getAlbums() throws -> [PlatformAlbum]
  func getAssetsCountSince(albumId: String, timestamp: Int64) throws -> Int64
  func getAssetsForAlbum(albumId: String, updatedTimeCond: Int64?) throws -> [PlatformAsset]
  func hashPaths(paths: [String]) throws -> [FlutterStandardTypedData?]
}

/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
class NativeSyncApiSetup {
  static var codec: FlutterStandardMessageCodec { MessagesPigeonCodec.shared }
  /// Sets up an instance of `NativeSyncApi` to handle messages through the `binaryMessenger`.
  static func setUp(binaryMessenger: FlutterBinaryMessenger, api: NativeSyncApi?, messageChannelSuffix: String = "") {
    let channelSuffix = messageChannelSuffix.count > 0 ? ".\(messageChannelSuffix)" : ""
    #if os(iOS)
      let taskQueue = binaryMessenger.makeBackgroundTaskQueue?()
    #else
      let taskQueue: FlutterTaskQueue? = nil
    #endif
    let shouldFullSyncChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.shouldFullSync\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
    if let api = api {
      shouldFullSyncChannel.setMessageHandler { _, reply in
        do {
          let result = try api.shouldFullSync()
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      shouldFullSyncChannel.setMessageHandler(nil)
    }
    let getMediaChangesChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getMediaChanges\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getMediaChanges\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      getMediaChangesChannel.setMessageHandler { _, reply in
        do {
          let result = try api.getMediaChanges()
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      getMediaChangesChannel.setMessageHandler(nil)
    }
    let checkpointSyncChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.checkpointSync\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
    if let api = api {
      checkpointSyncChannel.setMessageHandler { _, reply in
        do {
          try api.checkpointSync()
          reply(wrapResult(nil))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      checkpointSyncChannel.setMessageHandler(nil)
    }
    let clearSyncCheckpointChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.clearSyncCheckpoint\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
    if let api = api {
      clearSyncCheckpointChannel.setMessageHandler { _, reply in
        do {
          try api.clearSyncCheckpoint()
          reply(wrapResult(nil))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      clearSyncCheckpointChannel.setMessageHandler(nil)
    }
    let getAssetIdsForAlbumChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetIdsForAlbum\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetIdsForAlbum\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      getAssetIdsForAlbumChannel.setMessageHandler { message, reply in
        let args = message as! [Any?]
        let albumIdArg = args[0] as! String
        do {
          let result = try api.getAssetIdsForAlbum(albumId: albumIdArg)
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      getAssetIdsForAlbumChannel.setMessageHandler(nil)
    }
    let getAlbumsChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAlbums\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAlbums\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      getAlbumsChannel.setMessageHandler { _, reply in
        do {
          let result = try api.getAlbums()
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      getAlbumsChannel.setMessageHandler(nil)
    }
    let getAssetsCountSinceChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsCountSince\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsCountSince\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      getAssetsCountSinceChannel.setMessageHandler { message, reply in
        let args = message as! [Any?]
        let albumIdArg = args[0] as! String
        let timestampArg = args[1] as! Int64
        do {
          let result = try api.getAssetsCountSince(albumId: albumIdArg, timestamp: timestampArg)
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      getAssetsCountSinceChannel.setMessageHandler(nil)
    }
    let getAssetsForAlbumChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsForAlbum\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsForAlbum\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      getAssetsForAlbumChannel.setMessageHandler { message, reply in
        let args = message as! [Any?]
        let albumIdArg = args[0] as! String
        let updatedTimeCondArg: Int64? = nilOrValue(args[1])
        do {
          let result = try api.getAssetsForAlbum(albumId: albumIdArg, updatedTimeCond: updatedTimeCondArg)
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      getAssetsForAlbumChannel.setMessageHandler(nil)
    }
    let hashPathsChannel = taskQueue == nil
      ? FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec)
      : FlutterBasicMessageChannel(name: "dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashPaths\(channelSuffix)", binaryMessenger: binaryMessenger, codec: codec, taskQueue: taskQueue)
    if let api = api {
      hashPathsChannel.setMessageHandler { message, reply in
        let args = message as! [Any?]
        let pathsArg = args[0] as! [String]
        do {
          let result = try api.hashPaths(paths: pathsArg)
          reply(wrapResult(result))
        } catch {
          reply(wrapError(error))
        }
      }
    } else {
      hashPathsChannel.setMessageHandler(nil)
    }
  }
}
