import 'package:doctor_app_flutter/config/config.dart';
import 'package:doctor_app_flutter/core/enum/view_state.dart';
import 'package:doctor_app_flutter/core/model/referral/MyReferralPatientModel.dart';
import 'package:doctor_app_flutter/core/model/referral/add_referred_remarks_request.dart';
import 'package:doctor_app_flutter/core/provider/robot_provider.dart';
import 'package:doctor_app_flutter/core/service/AnalyticsService.dart';
import 'package:doctor_app_flutter/core/viewModel/patient-referral-viewmodel.dart';
import 'package:doctor_app_flutter/icons_app/doctor_app_icons.dart';
import 'package:doctor_app_flutter/locator.dart';
import 'package:doctor_app_flutter/screens/patients/profile/soap_update/shared_soap_widgets/bottom_sheet_title.dart';
import 'package:doctor_app_flutter/utils/dr_app_toast_msg.dart';
import 'package:doctor_app_flutter/utils/translations_delegate_base_utils.dart';
import 'package:doctor_app_flutter/utils/utils.dart';
import 'package:doctor_app_flutter/widgets/shared/app_scaffold_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/buttons/app_buttons_widget.dart';
import 'package:doctor_app_flutter/widgets/shared/loader/gif_loader_dialog_utils.dart';
import 'package:doctor_app_flutter/widgets/shared/speech-text-popup.dart';
import 'package:doctor_app_flutter/widgets/shared/text_fields/app-textfield-custom.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:speech_to_text/speech_recognition_error.dart';
import 'package:speech_to_text/speech_to_text.dart' as stt;

class AddReplayOnReferralPatient extends StatefulWidget {
  final PatientReferralViewModel? patientReferralViewModel;
  final MyReferralPatientModel? myReferralInPatientModel;
  final AddReferredRemarksRequestModel? myReferralInPatientRequestModel;
  final bool isEdited;

  const AddReplayOnReferralPatient({Key? key, this.patientReferralViewModel, this.myReferralInPatientModel, this.isEdited = false, this.myReferralInPatientRequestModel}) : super(key: key);

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

class _AddReplayOnReferralPatientState extends State<AddReplayOnReferralPatient> {
  bool isSubmitted = false;
  int replay = 1;
  int reject = 2;
  stt.SpeechToText speech = stt.SpeechToText();
  var recognizedWord;
  var event = RobotProvider();
  TextEditingController replayOnReferralController = TextEditingController();

  @override
  void initState() {
    requestPermissions();
    super.initState();
    replayOnReferralController.text = widget.myReferralInPatientModel!.referredDoctorRemarks ?? "";
  }

  @override
  Widget build(BuildContext context) {
    return AppScaffold(
      isShowAppBar: false,
      backgroundColor: Theme.of(context).scaffoldBackgroundColor,
      body: Column(
        children: [
          Expanded(
            child: SingleChildScrollView(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  BottomSheetTitle(title: 'Reply'),
                  SizedBox(
                    height: 10.0,
                  ),
                  Center(
                    child: FractionallySizedBox(
                      widthFactor: 0.9,
                      child: Column(
                        children: [
                          Stack(
                            children: [
                              AppTextFieldCustom(
                                hintText: 'Reply your responses here',
                                controller: replayOnReferralController,
                                maxLines: 35,
                                minLines: 25,
                                hasBorder: true,
                                validationError: replayOnReferralController.text.isEmpty && isSubmitted ? TranslationBase.of(context).emptyMessage : "",
                                onClick: () {},
                                onChanged: (value) {},
                                onFieldSubmitted: () {},
                              ),
                              Positioned(
                                top: 0,
                                //MediaQuery.of(context).size.height * 0,
                                right: 15,
                                child: IconButton(
                                  icon: Icon(
                                    DoctorApp.speechtotext,
                                    color: Colors.black,
                                    size: 35,
                                  ),
                                  onPressed: () {
                                    onVoiceText();
                                  },
                                ),
                              )
                            ],
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
          Container(
            // height: replayOnReferralController.text.isNotEmpty ? 130 : 70,
            // margin: EdgeInsets.all(SizeConfig.widthMultiplier! * 5),
            child: Column(
              children: <Widget>[
                replayOnReferralController.text.isEmpty
                    ? SizedBox()
                    : Container(
                        margin: EdgeInsets.all(16),
                        child: AppButton(
                          title: TranslationBase.of(context).clearText,
                          onPressed: () {
                            setState(() {
                              replayOnReferralController.text = '';
                            });
                          },
                        ),
                      ),
                Container(
                  margin: EdgeInsets.fromLTRB(16, 0, 16, 16),
                  child: Row(
                    children: [
                      Expanded(
                        child: AppButton(
                          onPressed: () async {
                            await locator<AnalyticsService>().logEvent(
                              eventCategory: "Add Replay On  Referral Patient",
                              eventAction: "Add Replay on Referral",
                            );
                            if (replayOnReferralController.text.isNotEmpty) {
                              GifLoaderDialogUtils.showMyDialog(context);
                              await widget.patientReferralViewModel!.replayReferred(replayOnReferralController.text.trim(), widget.myReferralInPatientModel!, reject);
                              if (widget.patientReferralViewModel!.state == ViewState.ErrorLocal) {
                                Utils.showErrorToast(widget.patientReferralViewModel!.error);
                              } else {
                                GifLoaderDialogUtils.hideDialog(context);
                                DrAppToastMsg.showSuccesToast("Has been rejected");
                                Navigator.of(context).pop();
                                Navigator.of(context).pop();
                              }
                            } else {
                              Utils.showErrorToast("You can't add empty reply");
                              setState(() {
                                isSubmitted = false;
                              });
                            }
                          },
                          title: TranslationBase.of(context).reject,
                          fontColor: Colors.white,
                          color: Colors.red[600]!,
                        ),
                      ),
                      SizedBox(
                        width: 4,
                      ),
                      Expanded(
                        child: AppButton(
                          onPressed: () async {
                            setState(() {
                              isSubmitted = true;
                            });
                            if (replayOnReferralController.text.isNotEmpty) {
                              GifLoaderDialogUtils.showMyDialog(context);
                              await widget.patientReferralViewModel!.replayReferred(replayOnReferralController.text.trim(), widget.myReferralInPatientModel!, replay);
                              if (widget.patientReferralViewModel!.state == ViewState.ErrorLocal) {
                                Utils.showErrorToast(widget.patientReferralViewModel!.error);
                              } else {
                                GifLoaderDialogUtils.hideDialog(context);
                                DrAppToastMsg.showSuccesToast("Your Reply Added Successfully");
                                Navigator.of(context).pop();
                                Navigator.of(context).pop();
                              }
                            } else {
                              Utils.showErrorToast("You can't add empty reply");
                              setState(() {
                                isSubmitted = false;
                              });
                            }
                          },
                          title: TranslationBase.of(context).noteConfirm,
                          fontColor: Colors.white,
                          color: AppGlobal.appGreenColor,
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  onVoiceText() async {
    new SpeechToText(context: context).showAlertDialog(context);
    var lang = TranslationBase.of(AppGlobal.CONTEX).locale.languageCode;
    bool available = await speech.initialize(onStatus: statusListener, onError: errorListener);
    if (available) {
      speech.listen(
        onResult: resultListener,
        // listenMode: ListenMode.confirmation,
        localeId: lang == 'en' ? 'en-US' : 'ar-SA',
      );
    } else {
      print("The user has denied the use of speech recognition.");
    }
  }

  void errorListener(SpeechRecognitionError error) {}

  void statusListener(String status) {
    recognizedWord = status == 'listening' ? 'Listening...' : 'Sorry....';
  }

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

  void resultListener(result) {
    recognizedWord = result.recognizedWords;
    event.setValue({"searchText": recognizedWord});

    if (result.finalResult == true) {
      setState(() {
        SpeechToText.closeAlertDialog(context);
        replayOnReferralController.text += recognizedWord + '\n';
      });
    }
  }
}
