import 'dart:math';

import 'package:autocomplete_textfield/autocomplete_textfield.dart';
import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/config/size_config.dart';
import 'package:doctor_app_flutter/core/model/get_medication_response_model.dart';
import 'package:doctor_app_flutter/core/viewModel/medicine_view_model.dart';
import 'package:doctor_app_flutter/screens/base/base_view.dart';
import 'package:doctor_app_flutter/screens/medicine/pharmacies_list_screen.dart';
import 'package:doctor_app_flutter/util/dr_app_shared_pref.dart';
import 'package:doctor_app_flutter/util/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/util/helpers.dart';
import 'package:doctor_app_flutter/util/translations_delegate_base.dart';
import 'package:doctor_app_flutter/widgets/medicine/medicine_item_widget.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_text_form_field.dart';
import 'package:doctor_app_flutter/widgets/shared/app_texts_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:speech_to_text/speech_recognition_result.dart';
import 'package:speech_to_text/speech_to_text.dart';

import '../../util/extenstions.dart';

DrAppSharedPreferances sharedPref = DrAppSharedPreferances();

class MedicineSearchScreen extends StatefulWidget with DrAppToastMsg {
  MedicineSearchScreen({this.changeLoadingStata});

  final Function changeLoadingStata;

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

class _MedicineSearchState extends State<MedicineSearchScreen> {
  var data;
  final myController = TextEditingController();
  Helpers helpers = new Helpers();
  bool _hasSpeech = false;
  String _currentLocaleId = "";
  bool _isInit = true;
  final SpeechToText speech = SpeechToText();
  String lastStatus = '';
  GetMedicationResponseModel _selectedMedication;
  GlobalKey key =
      new GlobalKey<AutoCompleteTextFieldState<GetMedicationResponseModel>>();

  // String lastWords;
  List<LocaleName> _localeNames = [];
  String lastError;
  double level = 0.0;
  double minSoundLevel = 50000;
  double maxSoundLevel = -50000;
  String reconizedWord;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
  }

  void requestPermissions() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.microphone,
    ].request();
  }

  Future<void> initSpeechState() async {
    bool hasSpeech = await speech.initialize(
        onError: errorListener, onStatus: statusListener);
    // if (hasSpeech) {
    //   _localeNames = await speech.locales();

    //   var systemLocale = await speech.systemLocale();
    _currentLocaleId = TranslationBase.of(context).locale.languageCode == 'en'
        ? 'en-GB'
        : 'ar-SA'; // systemLocale.localeId;
    // }

    if (!mounted) return;

    setState(() {
      _hasSpeech = hasSpeech;
    });
  }

  InputDecoration textFieldSelectorDecoration(
      String hintText, String selectedText, bool isDropDown,
      {IconData icon}) {
    return InputDecoration(
      focusedBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      enabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      disabledBorder: OutlineInputBorder(
        borderSide: BorderSide(color: Color(0xFFCCCCCC), width: 2.0),
        borderRadius: BorderRadius.circular(8),
      ),
      hintText: selectedText != null ? selectedText : hintText,
      suffixIcon: isDropDown ? Icon(icon ?? Icons.arrow_drop_down) : null,
      hintStyle: TextStyle(
        fontSize: 14,
        color: Colors.grey.shade600,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return BaseView<MedicineViewModel>(
      onModelReady: (model) async {
        // if (model.allMedicationList.length == 0)
        //   await model.getMedicationList();
      },
      builder: (_, model, w) {
        myController.text =model.searchText;
        return AppScaffold(
          // baseViewModel: model,
          isShowAppBar: false,
          appBarTitle: TranslationBase.of(context).searchMedicine,
          body: SingleChildScrollView(
            child: FractionallySizedBox(
              widthFactor: 0.97,
              child: SingleChildScrollView(
                  child: Container(
                    // height: SizeConfig.screenHeight,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        SizedBox(
                          height: SizeConfig.screenHeight * .16,
                        ),
                        FractionallySizedBox(
                          widthFactor: 0.9,
                          child: Container(
                            decoration: BoxDecoration(
                                borderRadius:
                                BorderRadius.all(Radius.circular(6.0)),
                                border: Border.all(
                                    width: 1.0, color: HexColor("#CCCCCC"))),
                            padding: EdgeInsets.all(10),
                            child: AppTextFormField(
                              borderColor: Colors.white,
                              hintText: TranslationBase.of(context)
                                  .searchMedicineNameHere,
                              controller: myController,
                              onSaved: (value) {},
                              onFieldSubmitted: (value) {
                                searchMedicine(context, model);
                              },
                              inputFormatter: ONLY_LETTERS,
                            ),
                          ),
                        ),
                        FractionallySizedBox(
                          widthFactor: 0.9,
                          child: Container(
                            child: Wrap(
                              alignment: WrapAlignment.center,
                              children: <Widget>[
                                // TODO change it secondary button and add loading
                                AppButton(
                                  title: TranslationBase.of(context).search,
                                  onPressed: () async{
                                    await searchMedicine(context, model);

                                  },
                                ),
                              ],
                            ),
                          ),
                        ),

                        Container(
                          margin: EdgeInsets.only(
                              left: SizeConfig.heightMultiplier * 2),
                          child: Row(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: <Widget>[
                              AppText(
                                TranslationBase
                                    .of(context)
                                    .youCanFind +
                                    (myController.text !=''?model.pharmacyItemsList.length
                                        .toString():'0' )+
                                    " " +
                                    TranslationBase
                                        .of(context)
                                        .itemsInSearch,
                                fontWeight: FontWeight.bold,
                              ),
                            ],
                          ),
                        ),
                        SizedBox(
                          height:10,
                        ),
                        if(myController.text !='')
                          Container(
                            height: MediaQuery
                                .of(context)
                                .size
                                .height * 0.5,
                            child: ListView.builder(
                              padding: const EdgeInsets.only(top:20),

                              scrollDirection: Axis.vertical,
                              // shrinkWrap: true,
                              itemCount:
                              model.pharmacyItemsList ==
                                  null
                                  ? 0
                                  : model
                                  .pharmacyItemsList.length,
                              itemBuilder:
                                  (BuildContext context, int index) {
                                return InkWell(
                                  child: MedicineItemWidget(
                                    label: model
                                        .pharmacyItemsList[index]
                                    ["ItemDescription"],
                                    url: model
                                        .pharmacyItemsList[index]
                                    ["ImageSRCUrl"],
                                  ),
                                  onTap: () {
                                    Navigator.push(
                                      context,
                                      MaterialPageRoute(
                                        builder: (context) =>
                                            PharmaciesListScreen(
                                                itemID: model
                                                    .pharmacyItemsList[
                                                index]["ItemID"],
                                                url: model
                                                    .pharmacyItemsList[
                                                index]["ImageSRCUrl"]),
                                      ),
                                    );
                                  },
                                );
                              },
                            ),
                          ),
                      ],
                    ),
                  )),
            ),
          ),
        );}

    );
  }

  searchMedicine(context, MedicineViewModel model) async {
    FocusScope.of(context).unfocus();
    if (myController.text.isNullOrEmpty()) {
      helpers.showErrorToast(TranslationBase
          .of(context)
          .typeMedicineName);
      //"Type Medicine Name")
      return;
    }
    if (myController.text.length < 3) {
      helpers.showErrorToast(TranslationBase
          .of(context)
          .moreThan3Letter);
      return;
    }

    GifLoaderDialogUtils.showMyDialog(context);

    await model.getMedicineItem(myController.text);
    GifLoaderDialogUtils.hideDialog(context);
  }

  startVoiceSearch() {
    // lastWords = "";
    lastError = "";
    speech.listen(
        onResult: resultListener,
        listenFor: Duration(seconds: 10),
        localeId: _currentLocaleId,
        onSoundLevelChange: soundLevelListener,
        cancelOnError: true,
        partialResults: true,
        onDevice: true,
        listenMode: ListenMode.confirmation);
    setState(() {});
  }

  void resultListener(SpeechRecognitionResult result) {
    setState(() {
      // lastWords = "${result.recognizedWords} - ${result.finalResult}";
      reconizedWord = result.recognizedWords;
      lastStatus = '';
      myController.text = reconizedWord;
      Future.delayed(const Duration(seconds: 2), () {
        // searchMedicine(context);
      });
    });
  }

  void errorListener(SpeechRecognitionError error) {
    // print("Received error status: $error, listening: ${speech.isListening}");
    setState(() {
      lastError = "${error.errorMsg} - ${error.permanent}";
    });
  }

  void statusListener(String status) {
    // print(
    // "Received listener status: $status, listening: ${speech.isListening}");
    setState(() {
      lastStatus = status;
    });
  }

  // _switchLang(selectedVal) {
  //   setState(() {
  //     _currentLocaleId = selectedVal;
  //   });
  //   print(selectedVal);
  // }

  void soundLevelListener(double level) {
    minSoundLevel = min(minSoundLevel, level);
    maxSoundLevel = max(maxSoundLevel, level);
    // print("sound level $level: $minSoundLevel - $maxSoundLevel ");
    setState(() {
      this.level = level;
    });
  }
}
