import 'package:doctor_app_flutter/core/enum/filter_type.dart';
import 'package:doctor_app_flutter/core/enum/viewstate.dart';
import 'package:doctor_app_flutter/core/model/Prescriptions/Prescriptions.dart';
import 'package:doctor_app_flutter/core/model/Prescriptions/perscription_pharmacy.dart';
import 'package:doctor_app_flutter/core/model/Prescriptions/prescription_report.dart';
import 'package:doctor_app_flutter/core/model/Prescriptions/prescription_report_enh.dart';
import 'package:doctor_app_flutter/core/model/Prescriptions/prescriptions_order.dart';
import 'package:doctor_app_flutter/core/service/prescriptions_service.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:flutter/material.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<PharmacyPrescriptions> get pharmacyPrescriptionsList => _prescriptionsService.pharmacyPrescriptionsList ;
  List<PrescriptionReportEnh> get  prescriptionReportEnhList => _prescriptionsService.prescriptionReportEnhList;


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

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

      setState(ViewState.Idle);
    }
  }
  _getPrescriptionsOrders() async {
    await _prescriptionsService.getPrescriptionsOrders();
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.ErrorLocal);
    } else {
      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));
      }
    });
  }


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

  getPrescriptionReport({Prescriptions prescriptions,@required PatiantInformtion patient}) async {
    setState(ViewState.Busy);
    await _prescriptionsService.getPrescriptionReport(prescriptions: prescriptions,patient: patient);
    if (_prescriptionsService.hasError) {
      error = _prescriptionsService.error;
      setState(ViewState.ErrorLocal);
    } else {
      setState(ViewState.Idle);
    }
  }



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



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



}
