import 'package:doctor_app_flutter/client/base_app_client.dart';
import 'package:doctor_app_flutter/models/doctor/clinic_model.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
import 'package:flutter/cupertino.dart';

import '../models/doctor/user_model.dart';

const LOGIN_URL = 'Services/Sentry.svc/REST/MemberLogIN_New';
const INSERT_DEVICE_IMEI =
    'Services/Sentry.svc/REST/DoctorApplication_INSERTDeviceIMEI';
const SELECT_DEVICE_IMEI =
    'Services/Sentry.svc/REST/DoctorApplication_SELECTDeviceIMEIbyIMEI';

const SEND_ACTIVATION_CODE_BY_OTP_NOTIFICATION_TYPE =
    'Services/Sentry.svc/REST/DoctorApplication_SendActivationCodebyOTPNotificationType';

const MEMBER_CHECK_ACTIVATION_CODE_NEW =
    'Services/Sentry.svc/REST/MemberCheckActivationCode_New';
const GET_DOC_PROFILES = 'Services/Doctors.svc/REST/GetDocProfiles';
DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();
enum APP_STATUS { LOADING, UNAUTHENTICATED, AUTHENTICATED }

class AuthProvider with ChangeNotifier {
  List<ClinicModel> doctorsClinicList = [];
  String selectedClinicName;
  bool isLogin = false;
  bool isLoading = true;
  AuthProvider() {
    getUserAuthentication();
  }

  void getUserAuthentication() async {
    Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
    if (profile != null) {
      isLoading = false;
      isLogin = true;
    } else {
      isLoading = false;
      isLogin = false;
    }
    notifyListeners();
  }

  APP_STATUS get stutas {
    if (isLoading) {
      return APP_STATUS.LOADING;
    } else {
      if (this.isLogin) {
        return APP_STATUS.AUTHENTICATED;
      } else {
        return APP_STATUS.UNAUTHENTICATED;
      }
    }
  }

  Future<dynamic> login(UserModel userInfo) async {
    try {
      dynamic localRes;

      await BaseAppClient.post(LOGIN_URL,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: {
        "UserID": userInfo.UserID,
        "Password": userInfo.Password,
        "ProjectID": userInfo.ProjectID,
        "LanguageID": userInfo.LanguageID,
        "IPAdress": userInfo.IPAdress,
        "VersionID": userInfo.VersionID,
        "Channel": userInfo.Channel,
        "SessionID": userInfo.SessionID
      });

      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }

  Future<dynamic> insertDeviceImei(imei) async {
    try {
      dynamic localRes;

      await BaseAppClient.post(INSERT_DEVICE_IMEI,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: imei);
      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }

  Future<dynamic> selectDeviceImei(imei) async {
    try {
      dynamic localRes;
      await BaseAppClient.post(SELECT_DEVICE_IMEI,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: imei);
      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }

  Future sendActivationCodeByOtpNotificationType(activationCodeModel) async {
    try {
      var localRes;
      await BaseAppClient.post(SEND_ACTIVATION_CODE_BY_OTP_NOTIFICATION_TYPE,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: activationCodeModel);
      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }

  Future<dynamic> memberCheckActivationCodeNew(activationCodeModel) async {
    try {
      dynamic localRes;
      await BaseAppClient.post(MEMBER_CHECK_ACTIVATION_CODE_NEW,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
        selectedClinicName =
            ClinicModel.fromJson(response['List_DoctorsClinic'][0]).clinicName;
        notifyListeners();
        response['List_DoctorsClinic'].forEach((v) {
          doctorsClinicList.add(new ClinicModel.fromJson(v));
        });
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: activationCodeModel);
      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }

  /*
 *@author: Elham Rababah
 *@Date:17/5/2020
 *@param: docInfo
 *@return:Future<Map>
 *@desc:  getDocProfiles
 */
  Future<dynamic> getDocProfiles(docInfo) async {
    try {
      dynamic localRes;
      await BaseAppClient.post(GET_DOC_PROFILES,
          onSuccess: (dynamic response, int statusCode) {
        localRes = response;
        //ClinicDescription
        selectedClinicName = response['DoctorProfileList'][0]['ClinicDescription'];
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: docInfo);
        notifyListeners();
      return Future.value(localRes);
    } catch (error) {
      print(error);
      throw error;
    }
  }
}
