import 'dart:async';

import '../server/server_private_info.dart';
import 'worker.dart';

class SftpReqItem {
  final ServerPrivateInfo spi;
  final String remotePath;
  final String localPath;

  SftpReqItem(this.spi, this.remotePath, this.localPath);
}

enum SftpReqType { download, upload }

class SftpReq {
  final SftpReqItem item;
  final String? privateKey;
  final SftpReqType type;

  SftpReq({required this.item, this.privateKey, required this.type});
}

class SftpReqStatus {
  final int id;
  final SftpReqItem item;
  final void Function() notifyListeners;
  late SftpWorker worker;
  final Completer? completer;

  String get fileName => item.localPath.split('/').last;

  // status of the download
  double? progress;
  SftpWorkerStatus? status;
  int? size;
  Exception? error;
  Duration? spentTime;

  SftpReqStatus({
    required this.item,
    required this.notifyListeners,
    required SftpReqType type,
    this.completer,
  }) : id = DateTime.now().microsecondsSinceEpoch {
    worker = SftpWorker(
      onNotify: onNotify,
      item: item,
      type: type,
    );
    worker.init();
  }

  @override
  bool operator ==(Object other) => other is SftpReqStatus && id == other.id;

  @override
  int get hashCode => id ^ super.hashCode;

  void onNotify(dynamic event) {
    switch (event.runtimeType) {
      case SftpWorkerStatus:
        status = event;
        if (status == SftpWorkerStatus.finished) {
          worker.dispose();
          completer?.complete();
        }
        break;
      case double:
        progress = event;
        break;
      case int:
        size = event;
        break;
      case Exception:
        error = event;
        break;
      case Duration:
        spentTime = event;
        break;
      default:
    }
    notifyListeners();
  }
}

enum SftpWorkerStatus { preparing, sshConnectted, downloading, finished }
