import 'dart:async';
import 'dart:convert';

import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/itg_forms_model.dart';
import 'package:mohem_flutter_app/models/dashboard/list_menu.dart';
import 'package:mohem_flutter_app/models/generic_response_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_main_response.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';

import 'package:uuid/uuid.dart';


class DashboardApiClient {
  static final DashboardApiClient _instance = DashboardApiClient._internal();

  DashboardApiClient._internal();

  factory DashboardApiClient() => _instance;

  Future<GetAttendanceTracking?> getAttendanceTracking() async {
    String url = "${ApiConsts.erpRest}GET_Attendance_Tracking";
    Map<String, dynamic> postParams = {};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData.getAttendanceTrackingList;
    }, url, postParams);
  }

  Future<GenericResponseModel?> getOpenNotifications() async {
    String url = "${ApiConsts.erpRest}GET_OPEN_NOTIFICATIONS";
    Map<String, dynamic> postParams = {};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  Future<GenericResponseModel?> getCOCNotifications() async {
    String url = "${ApiConsts.cocRest}Mohemm_ITG_ReviewerAdmin_Pending_Tasks";
    Map<String, dynamic> postParams = {"Date": DateUtil.getISODateFormat(DateTime.now()), "EmployeeNumber": AppState().memberInformationList?.eMPLOYEENUMBER};

    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  Future<ItgFormsModel?> getItgFormsPendingTask() async {
    String url = "${ApiConsts.cocRest}ITGFormsPendingTasks";
    Map<String, dynamic> postParams = {};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      ItgFormsModel responseData = ItgFormsModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  Future<List<GetAccrualBalancesList>> getAccrualBalances(String effectiveDate) async {
    String url = "${ApiConsts.erpRest}GET_ACCRUAL_BALANCES";
    Map<String, dynamic> postParams = {"P_EFFECTIVE_DATE": effectiveDate};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData.getAccrualBalancesList ?? [];
    }, url, postParams);
  }

  Future<GenericResponseModel?> getOpenMissingSwipes() async {
    String url = "${ApiConsts.erpRest}GET_OPEN_MISSING_SWIPES";
    Map<String, dynamic> postParams = {};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  //Menus List
  Future<List<ListMenu>> getListMenu() async {
    String url = "${ApiConsts.erpRest}GET_MENU";
    Map<String, dynamic> postParams = {};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData.listMenu ?? [];
    }, url, postParams);
  }

  //GET_MENU_ENTRIES
  Future<GenericResponseModel?> getGetMenuEntries() async {
    String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
    Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  //Mark Attendance
  Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = ""}) async {
    String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";
    var uuid = Uuid();
    // Generate a v4 (random) id

    Map<String, dynamic> postParams = {
      "UID": uuid.v4(), //Mobile Id
      "Latitude": lat,
      "Longitude": long,
      "QRValue": QRValue,
      "PointType": pointType, // NFC=2, Wifi = 3, QR= 1,
      "NFCValue": nfcValue,
      "WifiValue": pointType == 3 ? "100" : "",
      "IsGpsRequired": isGpsRequired
    };
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  //Check ITG Type
  Future<MohemmItgResponseItem?> getITGPageNotification() async {
    String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotification";

    Map<String, dynamic> postParams = {
      "EmployeeNumber": AppState().getUserName,
      "ItgEnableAt": "After Service Submission", //Mobile Id
      "ItgServiceName": "Login"
    };
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      GenericResponseModel responseData = GenericResponseModel.fromJson(json);
      MohemmItgResponseItem res = MohemmItgResponseItem.fromJson(jsonDecode(responseData.mohemmITGResponseItem ?? ""));
      // var jsonDecodedData = jsonDecode(jsonDecode(responseData.mohemmITGResponseItem!)['result']['data']);
      return res;
    }, url, postParams);
  }

  //Submit ITG
  Future<ItgMainRes?> submitItgForm({required String comment, required String masterId, required List<Map<String, dynamic>> itgList, required int serviceId}) async {
    String url = "${ApiConsts.cocRest}Mohemm_ITG_Survey_Response";

    Map<String, dynamic> postParams = {
      "EmployeeNumber": AppState().getUserName,
      "ItgComments": comment,
      "ItgNotificationMasterId": masterId,
      "ItgQuestionResponses": itgList,
      "ItgSurveyId": serviceId
    };
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      ItgMainRes responseData = ItgMainRes.fromJson(json);
      return responseData;
    }, url, postParams);
  }

  Future<ItgMainRes?> getAdvertisementDetail(String masterID) async {
    String url = "${ApiConsts.cocRest}Mohemm_ITG_GetPageNotificationDetails";

    Map<String, dynamic> postParams = {
      "EmployeeNumber": AppState().getUserName,
      "ItgNotificationMasterId": masterID, //Mobile Id
    };
    postParams.addAll(AppState().postParamsJson);
    return await ApiClient().postJsonForObject((json) {
      ItgMainRes responseData = ItgMainRes.fromJson(json);
      return responseData;
    }, url, postParams);
  }
}
