import 'package:diplomaticquarterapp/core/model/prescriptions/perscription_pharmacy.dart';
import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report.dart';
import 'package:diplomaticquarterapp/core/model/prescriptions/prescription_report_enh.dart';
import 'package:diplomaticquarterapp/core/model/prescriptions/prescriptions_order.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';

import '../../../core/enum/filter_type.dart';
import '../../../core/enum/viewstate.dart';
import '../../../core/model/prescriptions/Prescriptions.dart';
import '../../../core/service/medical/prescriptions_service.dart';
import '../../../locator.dart';
import '../base_view_model.dart';

class PrescriptionsViewModel extends BaseViewModel {
  FilterType filterType = FilterType.Clinic;
  PrescriptionsService _prescriptionsService = locator<PrescriptionsService>();

  List<PrescriptionsList> _prescriptionsOrderListClinic = List();
  List<PrescriptionsList> _prescriptionsOrderListHospital = List();


  List<PrescriptionReport> get prescriptionReportList =>
      _prescriptionsService.prescriptionReportList;

  List<Prescriptions> get prescriptionsList =>
      _prescriptionsService.prescriptionsList;

  List<PrescriptionsOrder>  get prescriptionsHistory => _prescriptionsService.prescriptionsOrderList;

  List<PharmacyPrescriptions> get pharmacyPrescriptionsList => _prescriptionsService.pharmacyPrescriptionsList ;


  List<PrescriptionsList> get prescriptionsOrderList =>
      filterType == FilterType.Clinic
          ? _prescriptionsOrderListClinic
          : _prescriptionsOrderListHospital;

  getPrescriptions() async {
    setState(ViewState.Busy);
    await _prescriptionsService.getPrescriptions();
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.Error);
    } else {
      _filterList();
      await _getPrescriptionsOrders();
      setState(ViewState.Idle);
    }
  }

  void _filterList() {
    _prescriptionsService.prescriptionsList.forEach((element) {
      ///  PrescriptionsList list sort clinic
      List<PrescriptionsList> prescriptionsByClinic =
          _prescriptionsOrderListClinic
              .where((elementClinic) =>
                  elementClinic.filterName == element.clinicDescription)
              .toList();

      if (prescriptionsByClinic.length != 0) {
        _prescriptionsOrderListClinic[
                _prescriptionsOrderListClinic.indexOf(prescriptionsByClinic[0])]
            .prescriptionsList
            .add(element);
      } else {
        _prescriptionsOrderListClinic.add(PrescriptionsList(
            filterName: element.clinicDescription, prescriptions: element));
      }

      ///  PrescriptionsList list sort via hospital
      List<PrescriptionsList> prescriptionsByHospital =
          _prescriptionsOrderListHospital
              .where(
                (elementClinic) => elementClinic.filterName == element.name,
              )
              .toList();

      if (prescriptionsByHospital.length != 0) {
        _prescriptionsOrderListHospital[_prescriptionsOrderListHospital
                .indexOf(prescriptionsByHospital[0])]
            .prescriptionsList
            .add(element);
      } else {
        _prescriptionsOrderListHospital.add(PrescriptionsList(
            filterName: element.name, prescriptions: element));
      }
    });
  }

  _getPrescriptionsOrders() async {
    await _prescriptionsService.getPrescriptionsOrders();
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.ErrorLocal);
    } else {
      setState(ViewState.Idle);
    }
  }

  setFilterType(FilterType filterType) {
    this.filterType = filterType;
    notifyListeners();
  }

  getPrescriptionReport({int dischargeNo}) async {
    setState(ViewState.Busy);
    await _prescriptionsService.getPrescriptionReport(dischargeNo: dischargeNo);
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.ErrorLocal);
    } else {
      setState(ViewState.Idle);
    }
  }

  sendPrescriptionEmail(
      {String appointmentDate,
      int patientID,
      String clinicName,
      String doctorName,
      int projectID}) async {
    setState(ViewState.BusyLocal);
    await _prescriptionsService.sendPrescriptionEmail(
        appointmentDate, patientID, clinicName, doctorName, projectID);
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.ErrorLocal);
      AppToast.showErrorToast(message: error);
    } else {
      AppToast.showSuccessToast(message: 'A copy has been sent to the e-mail');
      setState(ViewState.Idle);
    }
  }

  getListPharmacyForPrescriptions({int itemId}) async {
    setState(ViewState.Busy);
    await _prescriptionsService.getListPharmacyForPrescriptions(itemId: itemId);
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.Error);
    } else {
      setState(ViewState.Idle);
    }
  }


  List<PrescriptionReportEnh> get  prescriptionReportEnhList => _prescriptionsService.prescriptionReportEnhList;

  getPrescriptionReportEnh({PrescriptionsOrder prescriptionsOrder}) async {
    setState(ViewState.Busy);
    await _prescriptionsService.getPrescriptionReportEnh(prescriptionsOrder: prescriptionsOrder);
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.Error);
    } else {
      setState(ViewState.Idle);
    }
  }

}
