// ignore: must_be_immutable
import 'package:autocomplete_textfield/autocomplete_textfield.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/screens/base/base_view.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.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/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/dialogs/master_key_dailog.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/auto_complete_text_field.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/text_fields_utils.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:provider/provider.dart';

import '../../shared_soap_widgets/bottom_sheet_title.dart';

// 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;

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

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

  @override
  Widget build(BuildContext context) {
    ProjectViewModel projectViewModel = Provider.of(context);
    final screenSize = MediaQuery.of(context).size;
    return FractionallySizedBox(
      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: Center(
            child: Container(
              child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    BottomSheetTitle(
                      title: TranslationBase.of(context).addMedication,
                    ),
                    SizedBox(
                      height: 10,
                    ),
                    SizedBox(
                      height: 16,
                    ),
                    Expanded(
                      child: Center(
                        child: FractionallySizedBox(
                            widthFactor: 0.9,
                            child: Column(
                              children: [
                                SizedBox(
                                  height: 16,
                                ),
                                SizedBox(
                                  height: 16,
                                ),
                                Container(
                                  // height: screenSize.height * 0.070,
                                  child: InkWell(
                                    onTap: model.allMedicationList != null
                                        ? () {
                                            setState(() {
                                              _selectedMedication = null;
                                            });
                                          }
                                        : null,
                                    child: _selectedMedication == null
                                        ? CustomAutoCompleteTextField(
                                            isShowError: isFormSubmitted &&
                                                _selectedMedication == null,
                                            child: AutoCompleteTextField<
                                                GetMedicationResponseModel>(
                                              decoration: TextFieldsUtils
                                                  .textFieldSelectorDecoration(
                                                      TranslationBase.of(
                                                              context)
                                                          .searchMedicineNameHere,
                                                      null,
                                                      true,
                                                      suffixIcon: Icons.search),
                                              itemSubmitted: (item) => setState(
                                                  () => _selectedMedication =
                                                      item),
                                              key: key,
                                              suggestions:
                                                  model.allMedicationList,
                                              itemBuilder: (context,
                                                      suggestion) =>
                                                  new Padding(
                                                      child: AppText(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()),
                                            ),
                                          )
                                        : AppTextFieldCustom(
                                            hintText: _selectedMedication !=
                                                    null
                                                ? _selectedMedication
                                                        .description +
                                                    (' (${_selectedMedication.genericName} )')
                                                : TranslationBase.of(context)
                                                    .searchMedicineNameHere,
                                            minLines: 2,
                                            maxLines: 2,
                                            isTextFieldHasSuffix: true,
                                            suffixIcon: IconButton(
                                                icon: Icon(
                                              Icons.search,
                                              color: Colors.grey.shade600,
                                            )),
                                            enabled: false,
                                          ),
                                  ),
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                AppTextFieldCustom(
                                  enabled: false,
                                  onClick: 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,
                                  hintText:
                                      TranslationBase.of(context).doseTime,
                                  maxLines: 2,
                                  minLines: 2,
                                  isTextFieldHasSuffix: true,
                                  controller: doseController,
                                  validationError: isFormSubmitted &&
                                          _selectedMedicationDose == null
                                      ? TranslationBase.of(context).emptyMessage
                                      : null,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                AppTextFieldCustom(
                                  enabled: false,
                                  isTextFieldHasSuffix: true,
                                  onClick: 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,
                                  hintText:
                                      TranslationBase.of(context).strength,
                                  maxLines: 2,
                                  minLines: 2,
                                  controller: strengthController,
                                  validationError: isFormSubmitted &&
                                          _selectedMedicationStrength == null
                                      ? TranslationBase.of(context).emptyMessage
                                      : null,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                AppTextFieldCustom(
                                  enabled: false,
                                  isTextFieldHasSuffix: true,
                                  onClick: 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,
                                  hintText: TranslationBase.of(context).route,
                                  maxLines: 2,
                                  minLines: 2,
                                  controller: routeController,
                                  validationError: isFormSubmitted &&
                                          _selectedMedicationRoute == null
                                      ? TranslationBase.of(context).emptyMessage
                                      : null,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                AppTextFieldCustom(
                                  onClick: 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,
                                  hintText:
                                      TranslationBase.of(context).frequency,
                                  enabled: false,
                                  maxLines: 2,
                                  minLines: 2,
                                  isTextFieldHasSuffix: true,
                                  controller: frequencyController,
                                  validationError: isFormSubmitted &&
                                          _selectedMedicationFrequency == null
                                      ? TranslationBase.of(context).emptyMessage
                                      : null,
                                ),
                                SizedBox(
                                  height: 5,
                                ),
                                SizedBox(
                                  height: 30,
                                ),
                              ],
                            )),
                      ),
                    ),
                  ]),
            ),
          ),
          bottomSheet: Container(
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.all(
                Radius.circular(10.0),
              ),
              border: Border.all(color: HexColor('#707070'), width: 0.30),
            ),
            height: MediaQuery.of(context).size.height * 0.1,
            width: double.infinity,
            child: Column(
              children: [
                SizedBox(
                  height: 10,
                ),
                Container(
                  child: FractionallySizedBox(
                    widthFactor: .80,
                    child: Center(
                      child: AppButton(
                        title: TranslationBase.of(context)
                            .addMedication
                            .toUpperCase(),
                        color: Color(0xFF359846),
                        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();
                          }
                        },
                      ),
                    ),
                  ),
                ),
                SizedBox(
                  height: 5,
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}
