// import 'dart:io';

// import 'package:dio/dio.dart';
// import 'package:path_provider/path_provider.dart';
// import 'package:road24_mobile/data/http/CustomDioInterceptor.dart';
// import 'package:road24_mobile/data/shared_data.dart';
// import 'package:road24_mobile/model/utils/Config.dart';
// import 'package:road24_mobile/my_app.dart';

// class SignsAndRulesManualRepository {
//   static Map<String, String>? savedAssets;
//   var baseDioHeaders;
//   var baseDioOptions;

//   Dio preparing() {
//     baseDioHeaders = {
//       'Accept': 'application/json',
//     };
//     baseDioOptions = new BaseOptions(
//       baseUrl: 'http://68.183.212.82/',
//       headers: baseDioHeaders,
//       connectTimeout: 20000,
//       receiveTimeout: 20000,
//       sendTimeout: 20000,
//       contentType: 'application/json',
//       responseType: ResponseType.json,
//     );

//     Dio dio = new Dio(baseDioOptions)
//       ..interceptors.add(InterceptorsWrapper(
//         onRequest:
//             (RequestOptions options, RequestInterceptorHandler handler) async {
//           var token = MyApp.preferences?.getTokenKeyForDirectus();
//           // await MyApp.sharedPreferences.get(Config.userTokenKeyForDirectus);
//           if (token != null)
//             options.headers['Authorization'] = "Bearer " + token;
//           // return options;
//         },
//       ));

//     dio.interceptors.add(CustomDioInterceptor(
//       responseBody: true,
//       requestBody: true,
//       requestHeader: true,
//     ));
//     return dio;
//   }

//   initToken() async {
//     var manualBox = Preferences.manualBox;
//     //get token from local. If it doesn't exist
//     String? token = manualBox.get(Config.userTokenKeyForDirectus);
//     //login
//     if (token == null) {
//       Map data = await login(
//           email: "mobile@kashapp.uz", password: "&UqB-9p{pNG/Z,~\$");
//       //save both access and refresh token
//       manualBox.put(Config.userTokenKeyForDirectus, data["access token"]);
//       manualBox.put(
//           Config.userRefreshTokenKeyForDirectus, data["refresh token"]);
//     }
//   }

//   Future<Map<String, String>> login(
//       {required String email, required String password}) async {
//     String url = 'auth/login';
//     // first time log in
//     Response? response;
//     try {
//       response = await preparing().post(url, data: {
//         "email": email,
//         "password": password,
//       });
//     } catch (exception) {
//       //check if internet connection doesn't exist case also...
//       if (exception is DioError) {}
//     }
//     return {
//       "access token": response?.data["data"]["access_token"],
//       "refresh token": response?.data["data"]["refresh_token"],
//     };
//   }

//   Future<Map<String, String>> refreshToken(
//       {required String refreshToken}) async {
//     String url = 'auth/refresh';
//     // first time log in
//     Response? response;
//     try {
//       response = await preparing().post(
//         url,
//         data: {
//           "refresh_token": refreshToken,
//         },
//       );
//     } catch (exception) {
//       if (exception is DioError) {
//         if (exception.response?.statusCode == 403 ||
//             exception.response?.statusCode == 401) {
//           Map data = await login(
//               email: "mobile@kashapp.uz", password: "&UqB-9p{pNG/Z,~\$");
//           Preferences.manualBox
//               .put(Config.userTokenKeyForDirectus, data["access token"]);
//           Preferences.manualBox.put(
//               Config.userRefreshTokenKeyForDirectus, data["refresh token"]);
//         }
//       }
//     }
//     return {
//       "access token": response?.data["data"]["access_token"],
//       "refresh token": response?.data["data"]["refresh_token"],
//     };
//   }

//   initAssetsMap() {
//     savedAssets = Preferences.manualBox.get("assets");
//     if (savedAssets == null) {
//       savedAssets = {};
//     }
//   }

//   //application must execute initAssetsMap method before using this method
//   saveSignsAndRulesAssetIfNotSavedBefore(String url) async {
//     if (savedAssets!.keys.contains(url)) {
//       return savedAssets![url];
//     } else {
//       Directory directory =
//           await getApplicationDocumentsDirectory(); // asset's path in local
//       Directory _assetsFolder = Directory('${directory.path}/manual_assets');
//       if (!await _assetsFolder.exists()) {
//         _assetsFolder = await _assetsFolder.create(
//             recursive: true); // asset's path in local
//       }
//       try {
//         await preparing()
//             .download(url, _assetsFolder.path + '/something',
//                 options: Options(headers: {
//                   "Authorization":
//                       "Bearer ${Preferences.manualBox.get(Config.userTokenKeyForDirectus)}"
//                 }))
//             .then((value) async {
//           await File(_assetsFolder.path + '/something').rename(
//               _assetsFolder.path +
//                   '/' +
//                   url.split("/").last +
//                   value.headers["content-type"]!.first.split("/").last);
//           print("Extra");
//           print(_assetsFolder.path +
//               '/' +
//               url.split("/").last +
//               '.' +
//               value.headers["content-type"]!.first.split("/").last);

//           savedAssets!.addAll({
//             url: _assetsFolder.path +
//                 '/' +
//                 url.split("/").last +
//                 '.' +
//                 value.headers["content-type"]!.first.split("/").last
//           });
//         });
//         print("First attempt");
//       } catch (exception) {
//         //check if internet connection doesn't exist case also...
//         if (exception is DioError) {
//           if (exception.response?.statusCode == 403 ||
//               exception.response?.statusCode == 401) {
//             //token is expired
//             print("token is expired");
//             var manualBox = Preferences.manualBox;

//             Map<String, String> data = await refreshToken(
//                 refreshToken:
//                     manualBox.get(Config.userRefreshTokenKeyForDirectus));
//             manualBox.put(Config.userTokenKeyForDirectus, data["access token"]);
//             manualBox.put(
//                 Config.userRefreshTokenKeyForDirectus, data["refresh token"]);
//             await preparing()
//                 .download(url, _assetsFolder.path + '/something',
//                     options: Options(headers: {
//                       "Authorization":
//                           "Bearer ${manualBox.get(Config.userTokenKeyForDirectus)}"
//                     }))
//                 .then((value) async {
//               print("Data");
//               print(value.data);
//               print("Headers");
//               print(value.headers["content-type"]?.first.split("/").last);
//               print("Extra");
//               print(_assetsFolder.path +
//                   '/' +
//                   url.split("/").last +
//                   '.' +
//                   value.headers["content-type"]!.first.split("/").last);
//               savedAssets!.addAll({
//                 url: _assetsFolder.path +
//                     '/' +
//                     url.split("/").last +
//                     '.' +
//                     value.headers["content-type"]!.first.split("/").last
//               });
//             });
//           }
//         }
//       }

//       return savedAssets![url] ?? null;
//     }
//   }
// }
