import 'dart:io';

import 'package:dio/dio.dart';
import 'package:paperless_mobile/core/database/tables/user_credentials.dart';
// import 'package:web_socket_channel/io.dart';

abstract class StatusService {
  Future<void> startListeningBeforeDocumentUpload(
      String httpUrl, UserCredentials credentials, String documentFileName);
}

class WebSocketStatusService implements StatusService {
  late WebSocket? socket;
  // late IOWebSocketChannel? _channel;

  WebSocketStatusService();

  @override
  Future<void> startListeningBeforeDocumentUpload(
    String httpUrl,
    UserCredentials credentials,
    String documentFileName,
  ) async {
    //   socket = await WebSocket.connect(
    //     httpUrl.replaceFirst("http", "ws") + "/ws/status/",
    //     customClient: getIt<HttpClient>(),
    //     headers: {
    //       'Authorization': 'Token ${credentials.token}',
    //     },
    //   ).catchError((_) {
    //     // Use long polling if connection could not be established
    //   });

    //   if (socket != null) {
    //     socket!.where(isNotNull).listen((event) {
    //       final status = DocumentProcessingStatus.fromJson(event);
    //       getIt<DocumentStatusCubit>().updateStatus(status);
    //       if (status.currentProgress == 100) {
    //         socket!.close();
    //       }
    //     });
    //   }
  }
}

class LongPollingStatusService implements StatusService {
  final Dio client;
  const LongPollingStatusService(this.client);

  @override
  Future<void> startListeningBeforeDocumentUpload(
    String httpUrl,
    UserCredentials credentials,
    String documentFileName,
  ) async {
    //   final today = DateTime.now();
    //   bool consumptionFinished = false;
    //   int retryCount = 0;

    //   getIt<DocumentStatusCubit>().updateStatus(
    //     DocumentProcessingStatus(
    //       currentProgress: 0,
    //       filename: documentFileName,
    //       maxProgress: 100,
    //       message: ProcessingMessage.new_file,
    //       status: ProcessingStatus.working,
    //       taskId: DocumentProcessingStatus.unknownTaskId,
    //       documentId: null,
    //       isApproximated: true,
    //     ),
    //   );

    //   do {
    //     final response = await httpClient.get(
    //       Uri.parse(
    //           '$httpUrl/api/documents/?query=$documentFileName added:${formatDate(today)}'),
    //     );
    //     final data = await compute(
    //       PagedSearchResult.fromJson,
    //       PagedSearchResultJsonSerializer(
    //           jsonDecode(response.body), DocumentModel.fromJson),
    //     );
    //     if (data.count > 0) {
    //       consumptionFinished = true;
    //       final docId = data.results[0].id;
    //       getIt<DocumentStatusCubit>().updateStatus(
    //         DocumentProcessingStatus(
    //           currentProgress: 100,
    //           filename: documentFileName,
    //           maxProgress: 100,
    //           message: ProcessingMessage.finished,
    //           status: ProcessingStatus.success,
    //           taskId: DocumentProcessingStatus.unknownTaskId,
    //           documentId: docId,
    //           isApproximated: true,
    //         ),
    //       );
    //       return;
    //     }
    //     sleep(const Duration(seconds: 1));
    //   } while (!consumptionFinished && retryCount < maxRetries);
  }
}
