import 'dart:async';

import 'package:connectivity/connectivity.dart';
import 'package:doctor_app_flutter/client/base_app_client.dart';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/shared_pref_kay.dart';
import 'package:doctor_app_flutter/core/viewModel/auth_view_model.dart';
import 'package:doctor_app_flutter/models/doctor/clinic_model.dart';
import 'package:doctor_app_flutter/models/doctor/doctor_profile_model.dart';
import 'package:doctor_app_flutter/models/doctor/profile_req_Model.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';

Helpers helpers = Helpers();

class ProjectViewModel with ChangeNotifier {
  DrAppSharedPreferances sharedPref = DrAppSharedPreferances();
  Locale _appLocale;
  String currentLanguage = 'ar';
  bool _isArabic = false;
  bool isInternetConnection = true;
  List<ClinicModel> doctorClinicsList = [];
  bool isLoading = false;
  bool isError = false;
  bool isLogin = false;
  String error = '';
  BaseAppClient baseAppClient = BaseAppClient();

  Locale get appLocal => _appLocale;

  bool get isArabic => _isArabic;
  StreamSubscription subscription;
  ProjectViewModel() {
    loadSharedPrefLanguage();

    subscription = Connectivity()
        .onConnectivityChanged
        .listen((ConnectivityResult result) {
      switch (result) {
        case ConnectivityResult.wifi:
          isInternetConnection = true;
          break;
        case ConnectivityResult.mobile:
          isInternetConnection = true;
          break;
        case ConnectivityResult.none:
          isInternetConnection = false;
          break;
      }
      notifyListeners();
    });
  }

  void loadSharedPrefLanguage() async {
    currentLanguage = await sharedPref.getString(APP_Language);
    _appLocale = Locale(currentLanguage ?? 'en');
    _isArabic = currentLanguage != null
        ? currentLanguage == 'ar'
            ? true
            : false
        : false;
    notifyListeners();
  }

  void changeLanguage(String lan) {
    if (lan != "en" && currentLanguage != lan) {
      _appLocale = Locale("ar");
      _isArabic = true;
      currentLanguage = 'ar';
      sharedPref.setString(APP_Language, 'ar');
    } else if (lan != "ar" && currentLanguage != lan) {
      _appLocale = Locale("en");
      _isArabic = false;
      currentLanguage = 'en';
      sharedPref.setString(APP_Language, 'en');
    }
    callServicesAfterChangeLang();
    notifyListeners();
  }

  callServicesAfterChangeLang() {
    getProfile();
    getDoctorClinicsList();
  }

  @override
  void dispose() {
    if (subscription != null) subscription.cancel();
    super.dispose();
  }

  Future<dynamic> getDoctorClinicsList() async {
    try {
      dynamic localRes;

      await baseAppClient.post(GET_CLINICS_FOR_DOCTOR,
          onSuccess: (dynamic response, int statusCode) {
        doctorClinicsList = [];
        response['List_DoctorsClinic'].forEach((v) {
          doctorClinicsList.add(new ClinicModel.fromJson(v));
        });
        localRes = response;
      }, onFailure: (String error, int statusCode) {
        throw error;
      }, body: Map());

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

  void getProfile() async {
    Map profile = await sharedPref.getObj(DOCTOR_PROFILE);
    DoctorProfileModel doctorProfile = new DoctorProfileModel.fromJson(profile);
    ProfileReqModel docInfo = new ProfileReqModel(
      doctorID: doctorProfile.doctorID,
      clinicID: doctorProfile.clinicID,
      license: true,
      projectID: doctorProfile.projectID,
    );

    Provider.of<AuthViewModel>(AppGlobal.CONTEX, listen: false)
        .getDocProfiles(docInfo.toJson())
        .then((res) async {
      sharedPref.setObj(DOCTOR_PROFILE, res['DoctorProfileList'][0]);
    }).catchError((err) {
      print(err);
    });
  }
}
