import 'dart:convert';
import 'package:syncrow_web/pages/access_management/model/password_model.dart';
import 'package:syncrow_web/pages/visitor_password/model/device_model.dart';
import 'package:syncrow_web/pages/visitor_password/model/schedule_model.dart';
import 'package:syncrow_web/services/api/http_service.dart';
import 'package:syncrow_web/utils/constants/api_const.dart';

class AccessMangApi {
  Future<List<PasswordModel>> fetchVisitorPassword() async {
    try {
      final response = await HTTPService().get(
        path: ApiEndpoints.visitorPassword,
        showServerMessage: true,
        expectedResponseModel: (json) {
          List<dynamic> jsonData = json;
          List<PasswordModel> passwordList = jsonData.map((jsonItem) {
            return PasswordModel.fromJson(jsonItem);
          }).toList();
          return passwordList;
        },
      );
      return response;
    } catch (e) {
      return [];
    }
  }

  Future fetchDevices() async {
    try {
      final response = await HTTPService().get(
        path: ApiEndpoints.getDevices,
        showServerMessage: true,
        expectedResponseModel: (json) {
          List<dynamic> jsonData = json;
          List<DeviceModel> passwordList = jsonData.map((jsonItem) {
            return DeviceModel.fromJson(jsonItem);
          }).toList();
          return passwordList;
        },
      );
      return response;
    } catch (e) {
      return [];
    }
  }

  Future postOnlineOneTime(
      {String? email,
      String? passwordName,
      String? password,
      String? effectiveTime,
      String? invalidTime,
      List<String>? devicesUuid}) async {
    final response = await HTTPService().post(
      path: ApiEndpoints.sendOnlineOneTime,
      body: jsonEncode({
        "email": email,
        "passwordName": passwordName,
        "password": password,
        "devicesUuid": devicesUuid,
        "effectiveTime": effectiveTime,
        "invalidTime": invalidTime
      }),
      showServerMessage: true,
      expectedResponseModel: (json) {
        return json;
      },
    );
    return response;
  }

  Future postOnlineMultipleTime(
      {String? effectiveTime,
      String? invalidTime,
      String? email,
      String? password,
      String? passwordName,
      List<Schedule>? scheduleList,
      List<String>? devicesUuid}) async {
    Map<String, dynamic> body = {
      "email": email,
      "devicesUuid": devicesUuid,
      "passwordName": passwordName,
      "password": password,
      "effectiveTime": effectiveTime,
      "invalidTime": invalidTime,
    };
    if (scheduleList != null) {
      body["scheduleList"] = scheduleList.map((schedule) => schedule.toJson()).toList();
    }
    final response = await HTTPService().post(
      path: ApiEndpoints.sendOnlineMultipleTime,
      body: jsonEncode(body),
      showServerMessage: true,
      expectedResponseModel: (json) {
        return json;
      },
    );
    return response;
  }

// OffLine One Time Password

  Future postOffLineOneTime(
      {String? email, String? passwordName, List<String>? devicesUuid}) async {
    final response = await HTTPService().post(
      path: ApiEndpoints.sendOffLineOneTime,
      body: jsonEncode({"email": email, "passwordName": passwordName, "devicesUuid": devicesUuid}),
      showServerMessage: true,
      expectedResponseModel: (json) {
        return json;
      },
    );
    return response;
  }

  Future postOffLineMultipleTime(
      {String? email,
      String? passwordName,
      String? effectiveTime,
      String? invalidTime,
      List<String>? devicesUuid}) async {
    final response = await HTTPService().post(
      path: ApiEndpoints.sendOffLineMultipleTime,
      body: jsonEncode({
        "email": email,
        "devicesUuid": devicesUuid,
        "passwordName": passwordName,
        "effectiveTime": effectiveTime,
        "invalidTime": invalidTime,
      }),
      showServerMessage: true,
      expectedResponseModel: (json) {
        return json;
      },
    );
    return response;
  }
}
