import 'package:diplomaticquarterapp/config/config.dart';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/BookingOptions.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/Search.dart';
import 'package:diplomaticquarterapp/pages/landing/landing_page.dart';
import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart';
import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart';
import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart';
import 'package:diplomaticquarterapp/widgets/text/app_texts_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_tts/flutter_tts.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 'package:diplomaticquarterapp/widgets/robo-search/robosearch.dart';
import 'dart:math';
import 'package:diplomaticquarterapp/services/robo_search/event_provider.dart';

class SearchBot with ChangeNotifier {
  SearchBot() {
    requestPermissions();
    initSpeechState();
  }

  SearchProvider searchProvider = new SearchProvider();
  RobotProvider eventProvider = RobotProvider();
  bool isLoading = false;
  bool isError = false;
  final SpeechToText speech = SpeechToText();
  String error = '';
  String _currentLocaleId = "";
  String lastError;
  double level = 0.0;

  double minSoundLevel = 50000;
  double maxSoundLevel = -50000;
  String reconizedWord = '';
  FlutterTts flutterTts = FlutterTts();
  var selectedLang;
  bool isSearching = false;

  String lastStatus;

  bool _isInit = true;

  // @override
  // void didChangeDependencies() {
  //   super.didChangeDependencies();
  // if (_isInit) {

  // } else {
  //   startVoiceSearch();
  // }

  // _isInit = false;
  // }

  //@override
  // Widget build(BuildContext context) {
  //   return Column(
  //     children: <Widget>[
  //       Image.asset('assets/images/siri-ianzhao.gif'),
  //       AppText(
  //         reconizedWord,
  //         fontSize: 28,
  //       ),
  //       // SizedBox(
  //       //     child: FlatButton(
  //       //       child: Text('Start'),
  //       //       onPressed: () {
  //       //         setState(() {
  //       //           reconizedWord = 'Lisening...';
  //       //         });

  //       //       },
  //       //     ),
  //       //     height: 40,
  //       //     width: 80)
  //     ],
  //   );
  // }

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

  void resultListener(SpeechRecognitionResult result) {
    // lastWords = "${result.recognizedWords} - ${result.finalResult}";

    if (result.finalResult == true) {
      // setState(() {
      reconizedWord = result.recognizedWords;
      //});
      Future.delayed(const Duration(seconds: 1), () {
        _speak(reconizedWord);
      });
    }
    //});
  }

  Future _speak(reconizedWord) async {
    await flutterTts.speak(reconizedWord);

    getPages(reconizedWord);
  }

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

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

  Future<void> initSpeechState() async {
    await speech.initialize(onError: errorListener, onStatus: statusListener);

    _currentLocaleId =
        TranslationBase.of(AppGlobal.context).locale.languageCode == 'en'
            ? 'en-GB'
            : 'ar-SA'; // systemLocale.localeId;
    flutterTts.setLanguage(_currentLocaleId);

    await flutterTts.speak("Hello! How May I help you?");
    flutterTts.setCompletionHandler(() {
      startVoiceSearch();
    });

    // if (!mounted) return;
  }

  void errorListener(SpeechRecognitionError error) {
    //setState(() {
    // reconizedWord = "${error.errorMsg} - ${error.permanent}";
    //});
  }

  void statusListener(String status) {
    //setState(() {
    reconizedWord = status == 'listening' ? 'Lisening...' : 'Sorry....';
    //});
  }

  getPages(text) {
    var request = {
      'VoiceMessage': text,
      'Lang': TranslationBase.of(AppGlobal.context).locale.languageCode == 'en'
          ? 'En'
          : 'Ar'
    };

    searchProvider.getBotPages(request).then((value) => {});
    //getCommands(value['Response'], value['Understand'])
  }

  getCommands(result, understand) async {
    //RoboSearch.closeAlertDialog(context);
    print(result);
    switch (result["CommandNumber"]) {
      case '100':
        Navigator.push(
            AppGlobal.context,
            FadePage(
                page: BookingOptions(
              isAppbar: true,
            )));
        break;
      case '101':
        Navigator.push(
            AppGlobal.context,
            MaterialPageRoute(
                builder: (context) => Search(
                      type: 0,
                    )));
        break;
      case '102':
        Navigator.push(
            AppGlobal.context,
            MaterialPageRoute(
                builder: (context) => Search(
                      type: 1,
                    )));
        break;
      case '103':
        eventProvider.setValue({"clinic_id": understand});
        break;

      case '104':
        eventProvider.setValue({"project_id": understand});
        break;
      case '105':
        eventProvider.setValue({"doctor_id": understand});
        break;
      default:
        {
          eventProvider.setValue({"doctor_id": '40036'});
          //eventProvider.setValue();
          // if (result['CommandNumber'] == '0') {
          //   searchProvider.setData(understand);
          // }
        }
        break;
    }
    if (_currentLocaleId == 'en-GB') {
      await flutterTts.speak(result['ResponseEn']);
    } else {
      await flutterTts.speak(result['ResponseAr']);
    }
    //searchProvider.setLisener(result);
  }
}
