// Autogenerated from Pigeon (v26.3.4), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: unused_import, unused_shown_name
// ignore_for_file: type=lint

import 'dart:async';
import 'dart:typed_data' show Float64List, Int32List, Int64List;

import 'package:flutter/services.dart';
import 'package:meta/meta.dart' show immutable, protected, visibleForTesting;

Object? _extractReplyValueOrThrow(List<Object?>? replyList, String channelName, {required bool isNullValid}) {
  if (replyList == null) {
    throw PlatformException(
      code: 'channel-error',
      message: 'Unable to establish connection on channel: "$channelName".',
    );
  } else if (replyList.length > 1) {
    throw PlatformException(code: replyList[0]! as String, message: replyList[1] as String?, details: replyList[2]);
  } else if (!isNullValid && (replyList.isNotEmpty && replyList[0] == null)) {
    throw PlatformException(
      code: 'null-error',
      message: 'Host platform returned null value for non-null return value.',
    );
  }
  return replyList.firstOrNull;
}

bool _deepEquals(Object? a, Object? b) {
  if (identical(a, b)) {
    return true;
  }
  if (a is double && b is double) {
    if (a.isNaN && b.isNaN) {
      return true;
    }
    return a == b;
  }
  if (a is List && b is List) {
    return a.length == b.length && a.indexed.every(((int, dynamic) item) => _deepEquals(item.$2, b[item.$1]));
  }
  if (a is Map && b is Map) {
    if (a.length != b.length) {
      return false;
    }
    for (final MapEntry<Object?, Object?> entryA in a.entries) {
      bool found = false;
      for (final MapEntry<Object?, Object?> entryB in b.entries) {
        if (_deepEquals(entryA.key, entryB.key)) {
          if (_deepEquals(entryA.value, entryB.value)) {
            found = true;
            break;
          } else {
            return false;
          }
        }
      }
      if (!found) {
        return false;
      }
    }
    return true;
  }
  return a == b;
}

int _deepHash(Object? value) {
  if (value is List) {
    return Object.hashAll(value.map(_deepHash));
  }
  if (value is Map) {
    int result = 0;
    for (final MapEntry<Object?, Object?> entry in value.entries) {
      result += (_deepHash(entry.key) * 31) ^ _deepHash(entry.value);
    }
    return result;
  }
  if (value is double && value.isNaN) {
    // Normalize NaN to a consistent hash.
    return 0x7FF8000000000000.hashCode;
  }
  if (value is double && value == 0.0) {
    // Normalize -0.0 to 0.0 so they have the same hash code.
    return 0.0.hashCode;
  }
  return value.hashCode;
}

enum PlatformAssetPlaybackStyle { unknown, image, video, imageAnimated, livePhoto, videoLooping }

class PlatformAsset {
  PlatformAsset({
    required this.id,
    required this.name,
    required this.type,
    this.createdAt,
    this.updatedAt,
    this.width,
    this.height,
    required this.durationInSeconds,
    required this.orientation,
    required this.isFavorite,
    this.adjustmentTime,
    this.latitude,
    this.longitude,
    required this.playbackStyle,
  });

  String id;

  String name;

  int type;

  int? createdAt;

  int? updatedAt;

  int? width;

  int? height;

  int durationInSeconds;

  int orientation;

  bool isFavorite;

  int? adjustmentTime;

  double? latitude;

  double? longitude;

  PlatformAssetPlaybackStyle playbackStyle;

  List<Object?> _toList() {
    return <Object?>[
      id,
      name,
      type,
      createdAt,
      updatedAt,
      width,
      height,
      durationInSeconds,
      orientation,
      isFavorite,
      adjustmentTime,
      latitude,
      longitude,
      playbackStyle,
    ];
  }

  Object encode() {
    return _toList();
  }

  static PlatformAsset decode(Object result) {
    result as List<Object?>;
    return PlatformAsset(
      id: result[0]! as String,
      name: result[1]! as String,
      type: result[2]! as int,
      createdAt: result[3] as int?,
      updatedAt: result[4] as int?,
      width: result[5] as int?,
      height: result[6] as int?,
      durationInSeconds: result[7]! as int,
      orientation: result[8]! as int,
      isFavorite: result[9]! as bool,
      adjustmentTime: result[10] as int?,
      latitude: result[11] as double?,
      longitude: result[12] as double?,
      playbackStyle: result[13]! as PlatformAssetPlaybackStyle,
    );
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  bool operator ==(Object other) {
    if (other is! PlatformAsset || other.runtimeType != runtimeType) {
      return false;
    }
    if (identical(this, other)) {
      return true;
    }
    return _deepEquals(id, other.id) &&
        _deepEquals(name, other.name) &&
        _deepEquals(type, other.type) &&
        _deepEquals(createdAt, other.createdAt) &&
        _deepEquals(updatedAt, other.updatedAt) &&
        _deepEquals(width, other.width) &&
        _deepEquals(height, other.height) &&
        _deepEquals(durationInSeconds, other.durationInSeconds) &&
        _deepEquals(orientation, other.orientation) &&
        _deepEquals(isFavorite, other.isFavorite) &&
        _deepEquals(adjustmentTime, other.adjustmentTime) &&
        _deepEquals(latitude, other.latitude) &&
        _deepEquals(longitude, other.longitude) &&
        _deepEquals(playbackStyle, other.playbackStyle);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}

class PlatformAlbum {
  PlatformAlbum({
    required this.id,
    required this.name,
    this.updatedAt,
    required this.isCloud,
    required this.assetCount,
  });

  String id;

  String name;

  int? updatedAt;

  bool isCloud;

  int assetCount;

  List<Object?> _toList() {
    return <Object?>[id, name, updatedAt, isCloud, assetCount];
  }

  Object encode() {
    return _toList();
  }

  static PlatformAlbum decode(Object result) {
    result as List<Object?>;
    return PlatformAlbum(
      id: result[0]! as String,
      name: result[1]! as String,
      updatedAt: result[2] as int?,
      isCloud: result[3]! as bool,
      assetCount: result[4]! as int,
    );
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  bool operator ==(Object other) {
    if (other is! PlatformAlbum || other.runtimeType != runtimeType) {
      return false;
    }
    if (identical(this, other)) {
      return true;
    }
    return _deepEquals(id, other.id) &&
        _deepEquals(name, other.name) &&
        _deepEquals(updatedAt, other.updatedAt) &&
        _deepEquals(isCloud, other.isCloud) &&
        _deepEquals(assetCount, other.assetCount);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}

class SyncDelta {
  SyncDelta({required this.hasChanges, required this.updates, required this.deletes, required this.assetAlbums});

  bool hasChanges;

  List<PlatformAsset> updates;

  List<String> deletes;

  Map<String, List<String>> assetAlbums;

  List<Object?> _toList() {
    return <Object?>[hasChanges, updates, deletes, assetAlbums];
  }

  Object encode() {
    return _toList();
  }

  static SyncDelta decode(Object result) {
    result as List<Object?>;
    return SyncDelta(
      hasChanges: result[0]! as bool,
      updates: (result[1]! as List<Object?>).cast<PlatformAsset>(),
      deletes: (result[2]! as List<Object?>).cast<String>(),
      assetAlbums: (result[3]! as Map<Object?, Object?>).cast<String, List<String>>(),
    );
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  bool operator ==(Object other) {
    if (other is! SyncDelta || other.runtimeType != runtimeType) {
      return false;
    }
    if (identical(this, other)) {
      return true;
    }
    return _deepEquals(hasChanges, other.hasChanges) &&
        _deepEquals(updates, other.updates) &&
        _deepEquals(deletes, other.deletes) &&
        _deepEquals(assetAlbums, other.assetAlbums);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}

class HashResult {
  HashResult({required this.assetId, this.error, this.hash});

  String assetId;

  String? error;

  String? hash;

  List<Object?> _toList() {
    return <Object?>[assetId, error, hash];
  }

  Object encode() {
    return _toList();
  }

  static HashResult decode(Object result) {
    result as List<Object?>;
    return HashResult(assetId: result[0]! as String, error: result[1] as String?, hash: result[2] as String?);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  bool operator ==(Object other) {
    if (other is! HashResult || other.runtimeType != runtimeType) {
      return false;
    }
    if (identical(this, other)) {
      return true;
    }
    return _deepEquals(assetId, other.assetId) && _deepEquals(error, other.error) && _deepEquals(hash, other.hash);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}

class CloudIdResult {
  CloudIdResult({required this.assetId, this.error, this.cloudId});

  String assetId;

  String? error;

  String? cloudId;

  List<Object?> _toList() {
    return <Object?>[assetId, error, cloudId];
  }

  Object encode() {
    return _toList();
  }

  static CloudIdResult decode(Object result) {
    result as List<Object?>;
    return CloudIdResult(assetId: result[0]! as String, error: result[1] as String?, cloudId: result[2] as String?);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  bool operator ==(Object other) {
    if (other is! CloudIdResult || other.runtimeType != runtimeType) {
      return false;
    }
    if (identical(this, other)) {
      return true;
    }
    return _deepEquals(assetId, other.assetId) &&
        _deepEquals(error, other.error) &&
        _deepEquals(cloudId, other.cloudId);
  }

  @override
  // ignore: avoid_equals_and_hash_code_on_mutable_classes
  int get hashCode => _deepHash(<Object?>[runtimeType, ..._toList()]);
}

class _PigeonCodec extends StandardMessageCodec {
  const _PigeonCodec();
  @override
  void writeValue(WriteBuffer buffer, Object? value) {
    if (value is int) {
      buffer.putUint8(4);
      buffer.putInt64(value);
    } else if (value is PlatformAssetPlaybackStyle) {
      buffer.putUint8(129);
      writeValue(buffer, value.index);
    } else if (value is PlatformAsset) {
      buffer.putUint8(130);
      writeValue(buffer, value.encode());
    } else if (value is PlatformAlbum) {
      buffer.putUint8(131);
      writeValue(buffer, value.encode());
    } else if (value is SyncDelta) {
      buffer.putUint8(132);
      writeValue(buffer, value.encode());
    } else if (value is HashResult) {
      buffer.putUint8(133);
      writeValue(buffer, value.encode());
    } else if (value is CloudIdResult) {
      buffer.putUint8(134);
      writeValue(buffer, value.encode());
    } else {
      super.writeValue(buffer, value);
    }
  }

  @override
  Object? readValueOfType(int type, ReadBuffer buffer) {
    switch (type) {
      case 129:
        final value = readValue(buffer) as int?;
        return value == null ? null : PlatformAssetPlaybackStyle.values[value];
      case 130:
        return PlatformAsset.decode(readValue(buffer)!);
      case 131:
        return PlatformAlbum.decode(readValue(buffer)!);
      case 132:
        return SyncDelta.decode(readValue(buffer)!);
      case 133:
        return HashResult.decode(readValue(buffer)!);
      case 134:
        return CloudIdResult.decode(readValue(buffer)!);
      default:
        return super.readValueOfType(type, buffer);
    }
  }
}

class NativeSyncApi {
  /// Constructor for [NativeSyncApi].  The [binaryMessenger] named argument is
  /// available for dependency injection.  If it is left null, the default
  /// BinaryMessenger will be used which routes to the host platform.
  NativeSyncApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
    : pigeonVar_binaryMessenger = binaryMessenger,
      pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
  final BinaryMessenger? pigeonVar_binaryMessenger;

  static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();

  final String pigeonVar_messageChannelSuffix;

  Future<bool> shouldFullSync() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.shouldFullSync$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return pigeonVar_replyValue! as bool;
  }

  Future<SyncDelta> getMediaChanges() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getMediaChanges$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return pigeonVar_replyValue! as SyncDelta;
  }

  Future<void> checkpointSync() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.checkpointSync$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    _extractReplyValueOrThrow(pigeonVar_replyList, pigeonVar_channelName, isNullValid: true);
  }

  Future<void> clearSyncCheckpoint() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.clearSyncCheckpoint$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    _extractReplyValueOrThrow(pigeonVar_replyList, pigeonVar_channelName, isNullValid: true);
  }

  Future<List<String>> getAssetIdsForAlbum(String albumId) async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetIdsForAlbum$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[albumId]);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as List<Object?>).cast<String>();
  }

  Future<List<PlatformAlbum>> getAlbums() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAlbums$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as List<Object?>).cast<PlatformAlbum>();
  }

  Future<int> getAssetsCountSince(String albumId, int timestamp) async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsCountSince$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[albumId, timestamp]);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return pigeonVar_replyValue! as int;
  }

  Future<List<PlatformAsset>> getAssetsForAlbum(String albumId, {int? updatedTimeCond}) async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getAssetsForAlbum$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[albumId, updatedTimeCond]);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as List<Object?>).cast<PlatformAsset>();
  }

  Future<List<HashResult>> hashAssets(List<String> assetIds, {bool allowNetworkAccess = false}) async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.hashAssets$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[assetIds, allowNetworkAccess]);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as List<Object?>).cast<HashResult>();
  }

  Future<void> cancelHashing() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.cancelHashing$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    _extractReplyValueOrThrow(pigeonVar_replyList, pigeonVar_channelName, isNullValid: true);
  }

  Future<Map<String, List<PlatformAsset>>> getTrashedAssets() async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getTrashedAssets$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(null);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as Map<Object?, Object?>).cast<String, List<PlatformAsset>>();
  }

  Future<List<CloudIdResult>> getCloudIdForAssetIds(List<String> assetIds) async {
    final pigeonVar_channelName =
        'dev.flutter.pigeon.immich_mobile.NativeSyncApi.getCloudIdForAssetIds$pigeonVar_messageChannelSuffix';
    final pigeonVar_channel = BasicMessageChannel<Object?>(
      pigeonVar_channelName,
      pigeonChannelCodec,
      binaryMessenger: pigeonVar_binaryMessenger,
    );
    final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[assetIds]);
    final pigeonVar_replyList = await pigeonVar_sendFuture as List<Object?>?;

    final Object? pigeonVar_replyValue = _extractReplyValueOrThrow(
      pigeonVar_replyList,
      pigeonVar_channelName,
      isNullValid: false,
    );
    return (pigeonVar_replyValue! as List<Object?>).cast<CloudIdResult>();
  }
}
