import 'package:autocomplete_textfield/autocomplete_textfield.dart';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/master_lookup_key.dart';
import 'package:doctor_app_flutter/core/model/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/viewModel/SOAP_view_model.dart';
import 'package:doctor_app_flutter/core/viewModel/project_view_model.dart';
import 'package:doctor_app_flutter/models/SOAP/master_key_model.dart';
import 'package:doctor_app_flutter/models/SOAP/my_selected_allergy.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/shared/Text.dart';
import 'package:doctor_app_flutter/widgets/shared/TextFields.dart';
import 'package:doctor_app_flutter/widgets/shared/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/master_key_dailog.dart';
import 'package:eva_icons_flutter/eva_icons_flutter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../custom_validation_error.dart';

class UpdateMedicationWidget extends StatefulWidget {
  final TextEditingController medicationController;

  UpdateMedicationWidget({
    Key key,
    this.medicationController,
  });

  @override
  _UpdateMedicationWidgetState createState() => _UpdateMedicationWidgetState();
}

class _UpdateMedicationWidgetState extends State<UpdateMedicationWidget> {
  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);

    return Column(
      children: [
        Container(
          margin: EdgeInsets.only(left: 10, right: 10, top: 15),
          child: TextFields(
              hintText: TranslationBase.of(context).addMedication,
              fontSize: 13.5,
              onTapTextFields: () {
                openMedicationList(context);
              },
              readOnly: true,
              // hintColor: Colors.black,
              suffixIcon: EvaIcons.plusCircleOutline,
              suffixIconColor: AppGlobal.appPrimaryColor,
              fontWeight: FontWeight.w600,
              // controller: messageController,
              validator: (value) {
                if (value == null)
                  return TranslationBase
                      .of(context)
                      .emptyMessage;
                else
                  return null;
              }),
        ),
        SizedBox(
          height: 20,
        )
      ],
    );
  }


  openMedicationList(BuildContext context) {
    showModalBottomSheet(
        backgroundColor: Colors.white,
        isScrollControlled: true,
        context: context,
        builder: (context) {
          return AddMedication(
            addMedicationFun: (MySelectedAllergy mySelectedAllergy) {},
            medicationController: widget.medicationController,
          );
        });
  }
}

// ignore: must_be_immutable
class AddMedication extends StatefulWidget {
  final Function addMedicationFun;
  TextEditingController medicationController;

  AddMedication({Key key, this.addMedicationFun, this.medicationController})
      : super(key: key);

  @override
  _AddMedicationState createState() => _AddMedicationState();
}

class _AddMedicationState extends State<AddMedication> {
  MasterKeyModel _selectedMedicationDose;
  MasterKeyModel _selectedMedicationStrength;
  MasterKeyModel _selectedMedicationRoute;
  MasterKeyModel _selectedMedicationFrequency;

  MasterKeyModel _selectedAllergy;
  TextEditingController doseController = TextEditingController();
  TextEditingController strengthController = TextEditingController();
  TextEditingController routeController = TextEditingController();
  TextEditingController frequencyController = TextEditingController();
  GetMedicationResponseModel _selectedMedication;

  GlobalKey key =
      new GlobalKey<AutoCompleteTextFieldState<GetMedicationResponseModel>>();
  bool isFormSubmitted = false;

  InputDecoration textFieldSelectorDecoration(
      String hintText, String selectedText, bool isDropDown,
      {IconData icon}) {
    return InputDecoration(
      contentPadding: EdgeInsets.symmetric(vertical: 10, horizontal: 10),
      focusedBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Colors.grey, width: 1.0),
        borderRadius: BorderRadius.circular(8),
      ),
      enabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Colors.grey, width: 1.0),
        borderRadius: BorderRadius.circular(8),
      ),
      disabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Colors.grey, width: 1.0),
        borderRadius: BorderRadius.circular(8),
      ),
      hintText: selectedText != null ? selectedText : hintText,
      suffixIcon: isDropDown ? Icon(icon ?? Icons.arrow_drop_down) : null,
      hintStyle: TextStyle(
          fontSize: 10,
          color: Theme
              .of(context)
              .hintColor,
          fontWeight: FontWeight.w700
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);
    final screenSize = MediaQuery
        .of(context)
        .size;
    return FractionallySizedBox(
      heightFactor: 0.7,
      child: BaseView<SOAPViewModel>(
        onModelReady: (model) async {
          if (model.medicationStrengthList.length == 0) {
            await model.getMasterLookup(MasterKeysService.MedicationStrength,);
          }
          if (model.medicationFrequencyList.length == 0) {
            await model.getMasterLookup(MasterKeysService.MedicationFrequency);
          }
          if (model.medicationDoseTimeList.length == 0) {
            await model.getMasterLookup(MasterKeysService.MedicationDoseTime);
          }
          if (model.medicationRouteList.length == 0) {
            await model.getMasterLookup(MasterKeysService.MedicationRoute);
          }
          if (model.allMedicationList.length == 0)
            await model.getMedicationList();
        },
        builder: (_, model, w) =>
            AppScaffold(
                baseViewModel: model,
                isShowAppBar: false,
                body: SingleChildScrollView(
                  child: Center(
                    child: FractionallySizedBox(
                      widthFactor: 0.9,
                      child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [

                            SizedBox(
                              height: 16,
                            ),
                            AppText(
                              TranslationBase
                                  .of(context)
                                  .addMedication,
                              fontWeight: FontWeight.bold,
                              fontSize: 16,
                            ),
                            SizedBox(
                              height: 16,
                            ),
                            Container(
                              height: screenSize.height * 0.070,
                              child: InkWell(
                                onTap: model.allMedicationList != null
                                    ? () {
                                  setState(() {
                                    _selectedMedication = null;
                                  });
                                }
                                    : null,
                                child: _selectedMedication == null
                                    ? AutoCompleteTextField<
                                    GetMedicationResponseModel>(
                                  decoration: textFieldSelectorDecoration(
                                      TranslationBase
                                          .of(context)
                                          .searchMedicineNameHere,
                                      _selectedMedication != null
                                          ? _selectedMedication.genericName
                                          : null,
                                      true,
                                      icon: EvaIcons.search),
                                  itemSubmitted: (item) =>
                                      setState(
                                              () => _selectedMedication = item),
                                  key: key,
                                  suggestions: model.allMedicationList,
                                  itemBuilder: (context, suggestion) =>
                                  new Padding(
                                      child: Texts(
                                          suggestion.description + '/' +
                                              suggestion.genericName),
                                      padding: EdgeInsets.all(8.0)),
                                  itemSorter: (a, b) => 1,
                                  itemFilter: (suggestion, input) =>
                                  suggestion.genericName
                                      .toLowerCase()
                                      .startsWith(input.toLowerCase()) ||
                                      suggestion.description
                                          .toLowerCase()
                                          .startsWith(input.toLowerCase()) ||
                                      suggestion.keywords
                                          .toLowerCase()
                                          .startsWith(input.toLowerCase()),
                                )
                                    : TextField(
                                  minLines: 2,
                                  maxLines: 2,
                                  decoration: textFieldSelectorDecoration(
                                      TranslationBase
                                          .of(context)
                                          .searchMedicineNameHere,
                                      _selectedMedication != null
                                          ? _selectedMedication.description +
                                          (' (${_selectedMedication
                                              .genericName} )')
                                          : null,
                                      true,
                                      icon: EvaIcons.search),
                                  enabled: false,
                                ),
                              ),
                            ),
                            if(isFormSubmitted && _selectedMedication == null)
                              CustomValidationError(),
                            SizedBox(
                              height: 5,
                            ),
                            TextFields(
                                onTapTextFields: model.medicationDoseTimeList !=
                                    null
                                    ? () {
                                  MasterKeyDailog dialog = MasterKeyDailog(
                                    list: model.medicationDoseTimeList,
                                    okText: TranslationBase
                                        .of(context)
                                        .ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedMedicationDose =
                                            selectedValue;

                                        doseController.text =
                                        projectViewModel.isArabic
                                            ? _selectedMedicationDose
                                            .nameAr
                                            : _selectedMedicationDose
                                            .nameEn;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                                    : null,
                                hasLabelText: doseController.text !=
                                    '' ? true : false,
                                showLabelText: true,
                                hintText: TranslationBase
                                    .of(context)
                                    .doseTime,
                                //TODO add translation
                                fontSize: 13.5,
                                readOnly: true,
                                // hintColor: Colors.black,
                                fontWeight: FontWeight.w600,
                                maxLines: 2,
                                minLines: 1,
                                controller: doseController,
                                validator: (value) {
                                  if (value == null)
                                    return TranslationBase
                                        .of(context)
                                        .emptyMessage;
                                  else
                                    return null;
                                }),
                            SizedBox(
                              height: 5,
                            ),
                            if(isFormSubmitted &&
                                _selectedMedicationDose == null)
                              CustomValidationError(), SizedBox(
                              height: 5,
                            ),
                            TextFields(
                                onTapTextFields: model
                                    .medicationStrengthList != null
                                    ? () {
                                  MasterKeyDailog dialog = MasterKeyDailog(
                                    list: model.medicationStrengthList,
                                    okText: TranslationBase
                                        .of(context)
                                        .ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedMedicationStrength =
                                            selectedValue;

                                        strengthController.text =
                                        projectViewModel.isArabic
                                            ? _selectedMedicationStrength
                                            .nameAr
                                            : _selectedMedicationStrength
                                            .nameEn;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                                    : null,
                                hasLabelText: strengthController.text !=
                                    '' ? true : false,
                                showLabelText: true,
                                hintText: TranslationBase
                                    .of(context)
                                    .strength,
                                fontSize: 13.5,
                                readOnly: true,
                                // hintColor: Colors.black,
                                fontWeight: FontWeight.w600,
                                maxLines: 2,
                                minLines: 1,
                                controller: strengthController,
                                validator: (value) {
                                  if (value == null)
                                    return TranslationBase
                                        .of(context)
                                        .emptyMessage;
                                  else
                                    return null;
                                }), SizedBox(
                              height: 5,
                            ),
                            if(isFormSubmitted &&
                                _selectedMedicationStrength == null)
                              CustomValidationError(),

                            SizedBox(
                              height: 5,
                            ),

                            TextFields(
                                onTapTextFields: model
                                    .medicationRouteList != null
                                    ? () {
                                  MasterKeyDailog dialog = MasterKeyDailog(
                                    list: model.medicationRouteList,
                                    okText: TranslationBase
                                        .of(context)
                                        .ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedMedicationRoute =
                                            selectedValue;

                                        routeController.text =
                                        projectViewModel.isArabic
                                            ? _selectedMedicationRoute
                                            .nameAr
                                            : _selectedMedicationRoute
                                            .nameEn;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                                    : null,
                                hasLabelText: routeController.text !=
                                    '' ? true : false,
                                showLabelText: true,
                                hintText: TranslationBase
                                    .of(context)
                                    .route,
                                fontSize: 13.5,
                                readOnly: true,
                                // hintColor: Colors.black,
                                fontWeight: FontWeight.w600,
                                maxLines: 2,
                                minLines: 1,
                                controller: routeController,
                                validator: (value) {
                                  if (value == null)
                                    return TranslationBase
                                        .of(context)
                                        .emptyMessage;
                                  else
                                    return null;
                                }),
                            SizedBox(
                              height: 5,
                            ),
                            if(isFormSubmitted &&
                                _selectedMedicationRoute == null)
                              CustomValidationError(),
                            SizedBox(
                              height: 5,
                            ),
                            TextFields(
                                onTapTextFields: model
                                    .medicationFrequencyList != null
                                    ? () {
                                  MasterKeyDailog dialog = MasterKeyDailog(
                                    list: model.medicationFrequencyList,
                                    okText: TranslationBase
                                        .of(context)
                                        .ok,
                                    okFunction: (selectedValue) {
                                      setState(() {
                                        _selectedMedicationFrequency =
                                            selectedValue;

                                        frequencyController.text =
                                        projectViewModel.isArabic
                                            ? _selectedMedicationFrequency
                                            .nameAr
                                            : _selectedMedicationFrequency
                                            .nameEn;
                                      });
                                    },
                                  );
                                  showDialog(
                                    barrierDismissible: false,
                                    context: context,
                                    builder: (BuildContext context) {
                                      return dialog;
                                    },
                                  );
                                }
                                    : null,
                                hasLabelText: frequencyController.text !=
                                    '' ? true : false,
                                showLabelText: true,
                                hintText: TranslationBase
                                    .of(context)
                                    .frequency,
                                //TODO add translation
                                fontSize: 13.5,
                                readOnly: true,
                                // hintColor: Colors.black,
                                fontWeight: FontWeight.w600,
                                maxLines: 2,
                                minLines: 1,
                                controller: frequencyController,
                                validator: (value) {
                                  if (value == null)
                                    return TranslationBase
                                        .of(context)
                                        .emptyMessage;
                                  else
                                    return null;
                                }),
                            SizedBox(
                              height: 5,
                            ),
                            if(isFormSubmitted &&
                                _selectedMedicationFrequency == null)
                              CustomValidationError(),
                            SizedBox(
                              height: 30,
                            ),
                            AppButton(
                              title: TranslationBase
                                  .of(context)
                                  .add
                                  .toUpperCase(),
                              onPressed: () {
                                setState(() {
                                  isFormSubmitted = true;
                                });
                                if (_selectedMedication != null &&
                                    _selectedMedicationDose !=
                                        null &&
                                    _selectedMedicationStrength != null &&
                                    _selectedMedicationRoute != null &&
                                    _selectedMedicationFrequency != null) {
                                  widget.medicationController.text =
                                      widget.medicationController.text +
                                          '${_selectedMedication
                                              .description } (${TranslationBase
                                              .of(context)
                                              .doseTime} )  ${doseController
                                              .text} (${TranslationBase
                                              .of(context)
                                              .strength})   ${strengthController
                                              .text}  (${TranslationBase
                                              .of(context)
                                              .route })  ${routeController
                                              .text} (${TranslationBase
                                              .of(context)
                                              .frequency })  ${frequencyController
                                              .text} \n  \n';
                                  Navigator.of(context).pop();
                                }
                              },
                            ),
                          ]

                      ),
                    ),
                  ),
                ),),
      ),
    );
  }
}






