import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/models/patient/patiant_info_model.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_text_form_field.dart';
import 'package:doctor_app_flutter/widgets/shared/errors/dr_app_embedded_error.dart';
import 'package:doctor_app_flutter/widgets/shared/rounded_container_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import '../../../config/size_config.dart';
import '../../../providers/patients_provider.dart';
import '../../../util/dr_app_shared_pref.dart';
import '../../../widgets/shared/app_scaffold_widget.dart';
import '../../../widgets/shared/app_texts_widget.dart';
import '../../../widgets/shared/dr_app_circular_progress_Indeicator.dart';
import '../../../util/extenstions.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';

DrAppSharedPreferances sharedPref = new DrAppSharedPreferances();

/* 
 *@author: ibrahim albitar 
 *@Date:4/6/2020  
 *@param: 
 *@return:
 *@desc:
 */

class ReferPatientScreen extends StatefulWidget {
  @override
  _ReferPatientState createState() => _ReferPatientState();
}

class _ReferPatientState extends State<ReferPatientScreen> {
  PatientsProvider patientsProv;
  var doctorsList;
  final _remarksController = TextEditingController();
  final _extController = TextEditingController();
  var _isInit = true;
  bool isValid;

  var clinicId;
  var doctorId;
  var freqId;

  String _selectedClinic;
  String _selectedDoctor;
  String _selectedReferralFrequancy;

  int _activePriority = 1;

  FocusNode myFocusNode;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    if (_isInit) {
      myFocusNode = FocusNode();
      doctorsList = null;
      patientsProv = Provider.of<PatientsProvider>(context);
      patientsProv.getClinicsList();
      patientsProv.getReferralFrequancyList();
    }
    _isInit = false;
  }

  @override
  Widget build(BuildContext context) {
    return AppScaffold(
      appBarTitle: TranslationBase.of(context).myReferralPatient,
      body: patientsProv.isLoading
          ? DrAppCircularProgressIndeicator()
          : patientsProv.isError
              ? DrAppEmbeddedError(error: patientsProv.error)
              : patientsProv.clinicsList == null
                  ? DrAppEmbeddedError(error: 'Something Wrong!')
                  : SingleChildScrollView(
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          AppText(
                            TranslationBase.of(context).clinic,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),
                          RoundedContainer(
                            margin: 10,
                            showBorder: true,
                            raduis: 30,
                            borderColor: Color(0xff707070),
                            width: double.infinity,
                            child: Padding(
                              padding: EdgeInsets.only(
                                  top: SizeConfig.widthMultiplier * 0.9,
                                  bottom: SizeConfig.widthMultiplier * 0.9,
                                  right: SizeConfig.widthMultiplier * 3,
                                  left: SizeConfig.widthMultiplier * 3),
                              child: Row(
                                mainAxisSize: MainAxisSize.max,
                                children: <Widget>[
                                  Expanded(
                                    // add Expanded to have your dropdown button fill remaining space
                                    child: DropdownButton(
                                      isExpanded: true,
                                      value: _selectedClinic,
                                      iconSize: 40,
                                      elevation: 16,
                                      selectedItemBuilder:
                                          (BuildContext context) {
                                        return patientsProv
                                            .getClinicNameList()
                                            .map((item) {
                                          return Row(
                                            mainAxisSize: MainAxisSize.max,
                                            children: <Widget>[
                                              AppText(
                                                item,
                                                fontSize:
                                                    SizeConfig.textMultiplier *
                                                        2.1,
                                              ),
                                            ],
                                          );
                                        }).toList();
                                      },
                                      onChanged: (newValue) => {
                                        setState(() {
                                          _selectedDoctor = null;
                                          _selectedClinic = newValue;
                                          var clinicInfo = patientsProv
                                              .clinicsList
                                              .where((i) =>
                                                  i['ClinicDescription']
                                                      .toString()
                                                      .contains(
                                                          _selectedClinic))
                                              .toList();

                                          clinicId = clinicInfo[0]['ClinicID']
                                              .toString();

                                          patientsProv.getDoctorsList(clinicId);
                                        })
                                      },
                                      items: patientsProv
                                          .getClinicNameList()
                                          .map((item) {
                                        return DropdownMenuItem(
                                          value: item.toString(),
                                          child: Text(
                                            item,
                                            textAlign: TextAlign.end,
                                          ),
                                        );
                                      }).toList(),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ),
                          //--------------------------------------------------------------------//
                          AppText(
                            TranslationBase.of(context).doctor,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),

                          RoundedContainer(
                            margin: 10,
                            showBorder: true,
                            raduis: 30,
                            borderColor: Color(0xff707070),
                            width: double.infinity,
                            child: Padding(
                              padding: EdgeInsets.only(
                                  top: SizeConfig.widthMultiplier * 0.9,
                                  bottom: SizeConfig.widthMultiplier * 0.9,
                                  right: SizeConfig.widthMultiplier * 3,
                                  left: SizeConfig.widthMultiplier * 3),
                              child: Row(
                                mainAxisSize: MainAxisSize.max,
                                children: <Widget>[
                                  Expanded(
                                    // add Expanded to have your dropdown button fill remaining space
                                    child: DropdownButton(
                                      isExpanded: true,
                                      value: _selectedDoctor,
                                      iconSize: 40,
                                      elevation: 16,
                                      selectedItemBuilder:
                                          (BuildContext context) {
                                        return patientsProv
                                            .getDoctorNameList()
                                            .map((item) {
                                          return Row(
                                            mainAxisSize: MainAxisSize.max,
                                            children: <Widget>[
                                              AppText(
                                                item,
                                                fontSize:
                                                    SizeConfig.textMultiplier *
                                                        2.1,
                                              ),
                                            ],
                                          );
                                        }).toList();
                                      },
                                      onChanged: (newValue) => {
                                        setState(() {
                                          _selectedDoctor = newValue;
                                          doctorsList =
                                              patientsProv.doctorsList;

                                          var doctorInfo = doctorsList
                                              .where((i) => i['DoctorName']
                                                  .toString()
                                                  .contains(_selectedDoctor))
                                              .toList();
                                          doctorId = doctorInfo[0]['DoctorID']
                                              .toString();
                                        })
                                      },
                                      items: patientsProv
                                          .getDoctorNameList()
                                          .map((item) {
                                        return DropdownMenuItem(
                                          value: item.toString(),
                                          child: Text(
                                            item,
                                            textAlign: TextAlign.end,
                                          ),
                                        );
                                      }).toList(),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ), //-----------------------------///
                          AppText(
                            TranslationBase.of(context).ext,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),
                          Padding(
                            padding: const EdgeInsets.all(10.0),
                            child: AppTextFormField(
                              hintText: TranslationBase.of(context).ext,
                              controller: _extController,
                              inputFormatter: ONLY_NUMBERS,
                              textInputType: TextInputType.number,
                              onChanged: (value) => {},
                            ),
                          ),
                          AppText(
                            TranslationBase.of(context).priority,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),

                          priorityBar(context),

                          AppText(
                            TranslationBase.of(context).referralFrequency +
                                getPriority(),
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),

                          AppText(
                            TranslationBase.of(context).referralFrequency,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),
                          RoundedContainer(
                            margin: 10,
                            showBorder: true,
                            raduis: 30,
                            borderColor: Color(0xff707070),
                            width: double.infinity,
                            child: Padding(
                              padding: EdgeInsets.only(
                                  top: SizeConfig.widthMultiplier * 0.9,
                                  bottom: SizeConfig.widthMultiplier * 0.9,
                                  right: SizeConfig.widthMultiplier * 3,
                                  left: SizeConfig.widthMultiplier * 3),
                              child: Row(
                                mainAxisSize: MainAxisSize.max,
                                children: <Widget>[
                                  Expanded(
                                    // add Expanded to have your dropdown button fill remaining space
                                    child: DropdownButton(
                                      isExpanded: true,
                                      value: _selectedReferralFrequancy,
                                      iconSize: 40,
                                      elevation: 16,
                                      selectedItemBuilder:
                                          (BuildContext context) {
                                        return patientsProv
                                            .getReferralNamesList()
                                            .map((item) {
                                          return Row(
                                            mainAxisSize: MainAxisSize.max,
                                            children: <Widget>[
                                              AppText(
                                                item,
                                                fontSize:
                                                    SizeConfig.textMultiplier *
                                                        2.1,
                                              ),
                                            ],
                                          );
                                        }).toList();
                                      },
                                      onChanged: (newValue) => {
                                        setState(() {
                                          _selectedReferralFrequancy = newValue;
                                          var freqInfo = patientsProv
                                              .referalFrequancyList
                                              .singleWhere((i) => i[
                                                      'Description']
                                                  .toString()
                                                  .contains(
                                                      _selectedReferralFrequancy));
                                          freqId = freqInfo['ParameterCode']
                                              .toString();
                                          myFocusNode.requestFocus();
                                        })
                                      },
                                      items: patientsProv
                                          .getReferralNamesList()
                                          .map((item) {
                                        return DropdownMenuItem(
                                          value: item.toString(),
                                          child: Text(
                                            item,
                                            textAlign: TextAlign.end,
                                          ),
                                        );
                                      }).toList(),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ),
                          AppText(
                            TranslationBase.of(context).clinicDetailsandRemarks,
                            fontSize: 18,
                            fontWeight: FontWeight.bold,
                            marginLeft: 15,
                            marginTop: 15,
                          ),
                          Padding(
                            padding: const EdgeInsets.all(10.0),
                            child: AppTextFormField(
                              hintText: TranslationBase.of(context).remarks,
                              focusNode: myFocusNode,
                              controller: _remarksController,
                              inputFormatter: ONLY_LETTERS,
                              textInputType: TextInputType.text,
                              onChanged: (value) => {},
                            ),
                          ),
                          Padding(
                              padding: const EdgeInsets.all(20.0),
                              child: Column(
                                children: <Widget>[
                                  AppText(
                                    TranslationBase.of(context).pleaseFill,
                                    color: Colors.red,
                                    fontWeight: FontWeight.bold,
                                    margin: 10,
                                    visibility:
                                        isValid == null ? false : !isValid,
                                  ),
                                  AppButton(
                                    title: TranslationBase.of(context).send,
                                    color: Color(PRIMARY_COLOR),
                                    onPressed: () => {referToDoctor(context)},
                                  )
                                ],
                              ))
                        ],
                      ),
                    ),
    );
  }

  Widget priorityBar(BuildContext _context) {
    List<String> _priorities = [
      TranslationBase.of(context).veryUrgent,
      TranslationBase.of(context).urgent,
      TranslationBase.of(context).routine,
    ];
    return Container(
      height: MediaQuery.of(context).size.height * 0.065,
      width: SizeConfig.screenWidth * 0.9,
      margin: EdgeInsets.only(top: 10),
      decoration: BoxDecoration(
          color: Color(0Xffffffff), borderRadius: BorderRadius.circular(20)),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: _priorities.map((item) {
          bool _isActive = _priorities[_activePriority] == item ? true : false;
          return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
            InkWell(
                child: Center(
                  child: Container(
                      height: 40,
                      width: 90,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(50),
                        color: _isActive ? Hexcolor("#B8382B") : Colors.white,
                      ),
                      child: Center(
                        child: Text(
                          item,
                          style: TextStyle(
                            fontSize: 12,
                            color: _isActive
                                ? Colors.white
                                : Colors.black, //Colors.black,
                            //     backgroundColor:_isActive
                            // ? Hexcolor("#B8382B")
                            // : Colors.white,//sideColor,

                            fontWeight: FontWeight.bold,
                          ),
                        ),
                      )),
                ),
                onTap: () {
                  print(_priorities.indexOf(item));
                  setState(() {
                    _activePriority = _priorities.indexOf(item);
                  });
                }),
            _isActive
                ? Container(
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(10),
                        color: Colors.white),
                    alignment: Alignment.center,
                    height: 3,
                    width: 90,
                  )
                : Container()
          ]);
        }).toList(),
      ),
    );
  }

  String getPriority() {
    DateTime date = DateTime.now();
    switch (_activePriority) {
      case 0:
        date = date.add(new Duration(hours: 3));
        break;
      case 1:
        date = date.add(new Duration(hours: 6));
        break;
      case 2:
        date = date.add(new Duration(days: 1));
        break;
    }
    var format = DateFormat('yyyy/mm/dd HH:mm a');
    var time = format.format(date);
    print(time);
    return time;
  }

  void referToDoctor(context) {
    if (!validation()) {
      return;
    }

    final routeArgs = ModalRoute.of(context).settings.arguments as Map;
    PatiantInformtion patient = routeArgs['patient'];
    patientsProv.referToDoctor(context,
        extension: _extController.value.text,
        admissionNo: int.parse(patient.admissionNo),
        referringDoctorRemarks: _remarksController.value.text,
        frequency: freqId,
        patientID: patient.patientId,
        patientTypeID: patient.patientType,
        priority: (_activePriority + 1).toString(),
        roomID: patient.roomId,
        selectedClinicID: clinicId.toString(),
        selectedDoctorID: doctorId.toString(),
        projectID: patient.projectId);
  }

  bool validation() {
    setState(() {
      isValid = !_extController.value.text.isNullOrEmpty() &&
          !_remarksController.value.text.isNullOrEmpty() &&
          freqId != null &&
          clinicId != null &&
          doctorId != null;
    });
    return isValid;
  }
}
