import 'dart:typed_data';

import 'package:barcode_scan2/barcode_scan2.dart';
import 'package:hmg_patient_app/analytics/google-analytics.dart';
import 'package:hmg_patient_app/config/shared_pref_kay.dart';
import 'package:hmg_patient_app/core/model/privilege/ProjectDetailListModel.dart';
import 'package:hmg_patient_app/core/viewModels/project_view_model.dart';
import 'package:hmg_patient_app/locator.dart';
import 'package:hmg_patient_app/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:hmg_patient_app/models/Appointments/DoctorListResponse.dart';
import 'package:hmg_patient_app/models/Appointments/PatientShareResposne.dart';
import 'package:hmg_patient_app/models/Authentication/authenticated_user.dart';
import 'package:hmg_patient_app/models/header_model.dart';
import 'package:hmg_patient_app/pages/landing/landing_page.dart';
import 'package:hmg_patient_app/routes.dart';
import 'package:hmg_patient_app/services/appointment_services/GetDoctorsList.dart';
import 'package:hmg_patient_app/theme/colors.dart';
import 'package:hmg_patient_app/uitl/app_shared_preferences.dart';
import 'package:hmg_patient_app/uitl/app_toast.dart';
import 'package:hmg_patient_app/uitl/date_uitl.dart';
import 'package:hmg_patient_app/uitl/gif_loader_dialog_utils.dart';
import 'package:hmg_patient_app/uitl/location_util.dart';
import 'package:hmg_patient_app/uitl/translations_delegate_base.dart';
import 'package:hmg_patient_app/uitl/utils.dart';
import 'package:hmg_patient_app/uitl/utils_new.dart';
import 'package:hmg_patient_app/widgets/buttons/custom_text_button.dart';
import 'package:hmg_patient_app/widgets/data_display/medical/medical_profile_item.dart';
import 'package:hmg_patient_app/widgets/dialogs/confirm_dialog.dart';
import 'package:hmg_patient_app/widgets/new_design/doctor_header.dart';
import 'package:hmg_patient_app/widgets/nfc/nfc_reader_sheet.dart';
import 'package:hmg_patient_app/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_nfc_kit/flutter_nfc_kit.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:provider/provider.dart';

class QRCode extends StatefulWidget {
  late PatientShareResponse? patientShareResponse;
  late AppoitmentAllHistoryResultList? appointment;
  late String? appoQR;
  AuthenticatedUser? authUser;
  AppSharedPreferences sharedPref = AppSharedPreferences();

  QRCode({required this.patientShareResponse, required this.appoQR, this.appointment});

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

class _QRCodeState extends State<QRCode> {
  late Uint8List _bytes;
  bool _supportsNFC = false;
  late BuildContext _context;

  late ProjectViewModel projectViewModel;
  late LocationUtils locationUtils;
  ProjectDetailListModel projectDetailListModel = ProjectDetailListModel();

  @override
  void initState() {
    // TODO: implement initState

    // _bytes = base64.decode(widget.appoQR.split(',').last);
    widget.authUser = new AuthenticatedUser();

    // WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
    // startNFCScan();
    // });

    super.initState();
  }

  startNFCScan() {
    Future.delayed(const Duration(milliseconds: 500), () {
      showNfcReader(context, onNcfScan: (String nfcId) {
        Future.delayed(const Duration(milliseconds: 100), () {
          sendNfcCheckInRequest(nfcId, 2);
          locator<GAnalytics>().todoList.to_do_list_nfc(widget.appointment!);
        });
      }, onCancel: () {
        // Navigator.of(context).pop();
        locator<GAnalytics>().todoList.to_do_list_nfc_cancel(widget.appointment!);
      });
    });
  }

  startQRCodeScan() async {
    String onlineCheckInQRCode = (await BarcodeScanner.scan().then((value) => value.rawContent));
    if (onlineCheckInQRCode != "") {
      sendNfcCheckInRequest(onlineCheckInQRCode, 2);
      locator<GAnalytics>().todoList.to_do_list_nfc(widget.appointment!);
    } else {}
  }

  startLocationCheckIn() async {
    GifLoaderDialogUtils.showMyDialog(context);
    locationUtils = new LocationUtils(isShowConfirmDialog: true, context: context);
    locationUtils.getCurrentLocation(callBack: (value) {
      projectDetailListModel = Utils.getProjectDetailObj(projectViewModel, widget.appointment!.projectID);
      double dist = Utils.distance(value.latitude, value.longitude, double.parse(projectDetailListModel.latitude!), double.parse(projectDetailListModel.longitude!)).ceilToDouble() * 1000;
      print(dist);
      if (dist <= projectDetailListModel.geofenceRadius!) {
        sendNfcCheckInRequest(projectDetailListModel.checkInQrCode!, 2);
      } else {
        GifLoaderDialogUtils.hideDialog(context);
        AppToast.showErrorToast(message: TranslationBase.of(context).locationCheckInError);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    projectViewModel = Provider.of(context);
    _context = context;
    FlutterNfcKit.nfcAvailability.then((value) {
      _supportsNFC = (value == NFCAvailability.available);
    });
    List<Widget> checkInOptionsList = getCheckInOptionsList(context);
    return AppScaffold(
      appBarTitle: TranslationBase.of(context).onlineCheckIn,
      isShowAppBar: true,
      showNewAppBar: true,
      showNewAppBarTitle: true,
      body: SingleChildScrollView(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            DoctorHeader(
              headerModel: HeaderModel(
                widget.appointment!.doctorTitle! + " " + widget.appointment!.doctorNameObj!,
                widget.appointment!.doctorID ?? 0,
                widget.appointment!.doctorImageURL!,
                widget.appointment!.doctorSpeciality!,
                "",
                widget.appointment!.projectName!,
                DateUtil.convertStringToDate(widget.appointment!.appointmentDate!),
                widget.appointment!.isLiveCareAppointment!
                    ? DateUtil.convertStringToDate(widget.appointment!.appointmentDate!).toString().split(" ")[1].substring(0, 5)
                    : widget.appointment!.startTime!.substring(0, 5),
                "null",
                widget.appointment!.doctorRate,
                widget.appointment!.actualDoctorRate,
                widget.appointment!.noOfPatientsRate,
                "",
              ),
              isShowName: true,
              isNeedToShowButton: false,
              buttonTitle: '',
              onTap: () {},
              onRatingAndReviewTap: () {},
            ),
            InkWell(
              child: Container(
                margin: EdgeInsets.only(top: 30.0),
                padding: EdgeInsets.all(8),
                child: SvgPicture.asset(
                  "assets/images/nfc/contactless.svg",
                  width: 80.0,
                  height: 80.0,
                ),
              ),
              onTap: () {
                showNfcReader(context, onNcfScan: (String nfcId) {
                  Future.delayed(const Duration(milliseconds: 100), () {
                    sendNfcCheckInRequest(nfcId, 2);

                    locator<GAnalytics>().todoList.to_do_list_nfc(widget.appointment!);
                  });
                }, onCancel: () {
                  // Navigator.of(context).pop();
                  locator<GAnalytics>().todoList.to_do_list_nfc_cancel(widget.appointment!);
                });
              },
            ),
            Row(
              children: <Widget>[
                Expanded(
                  child: Container(
                    width: double.infinity,
                    margin: EdgeInsets.only(top: 15.0, bottom: 10.0, left: 20.0, right: 20.0),
                    child: Text(TranslationBase.of(context).scanQRHospital,
                        style: TextStyle(
                          fontSize: 20,
                          fontWeight: FontWeight.w600,
                          letterSpacing: -0.48,
                        )),
                  ),
                ),
              ],
            ),
            mHeight(21),
            Padding(
              padding: EdgeInsets.only(left: 21, right: 21),
              child: GridView.builder(
                shrinkWrap: true,
                primary: false,
                physics: NeverScrollableScrollPhysics(),
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12),
                padding: EdgeInsets.zero,
                itemCount: checkInOptionsList.length,
                itemBuilder: (BuildContext context, int index) {
                  return checkInOptionsList[index];
                },
              ),
            ),
          ],
        ),
      ),
      // bottomSheet: Container(
      //   color: CustomColors.appBackgroudGreyColor,
      //   padding: EdgeInsets.all(21),
      //   // height: 45.0,
      //   child: Row(
      //     children: [
      //       Expanded(
      //         flex: 1,
      //         child: ButtonTheme(
      //           shape: RoundedRectangleBorder(
      //             borderRadius: BorderRadius.circular(10.0),
      //           ),
      //           height: 45.0,
      //           child: CustomTextButton(
      //             backgroundColor: CustomColors.green,
      //             elevation: 0,
      //             onPressed: () {
      //               startNFCScan();
      //             },
      //             child: Text(TranslationBase.of(context).scanNFC,
      //                 style: TextStyle(
      //                   fontSize: 18.0,
      //                   color: Colors.white,
      //                 )),
      //           ),
      //         ),
      //       ),
      //     ],
      //   ),
      // ),
    );
  }

  List<Widget> getCheckInOptionsList(BuildContext context) {
    List<Widget> optionsList = [];

    optionsList.add(
      InkWell(
        onTap: () {
          if (projectViewModel.havePrivilege(102)) {
            startLocationCheckIn();
          }
        },
        child: MedicalProfileItem(
          title: TranslationBase.of(context).checkInViaLocation,
          imagePath: 'location.svg',
          subTitle: "",
          isEnable: projectViewModel.havePrivilege(102),
          width: 70.0,
          height: 70.0,
        ),
      ),
    );

    optionsList.add(
      InkWell(
        onTap: () {
          if (projectViewModel.havePrivilege(79)) {
            startQRCodeScan();
          }
        },
        child: MedicalProfileItem(
          title: TranslationBase.of(context).pharmaLiveCareScanQR,
          imagePath: 'qr_code.svg',
          subTitle: "",
          isEnable: projectViewModel.havePrivilege(79),
          width: 80.0,
          height: 80.0,
        ),
      ),
    );

    optionsList.add(
      InkWell(
        onTap: () {
          if (projectViewModel.havePrivilege(80) && _supportsNFC) {
            startNFCScan();
          } else {
            Utils.showErrorToast(TranslationBase.of(context).NFCNotSupported);
          }
        },
        child: MedicalProfileItem(
          title: TranslationBase.of(context).scanNFC,
          imagePath: 'contactless.svg',
          subTitle: "",
          isEnable: projectViewModel.havePrivilege(80),
          width: 80.0,
          height: 80.0,
        ),
      ),
    );

    return optionsList;
  }

  sendEmail() async {
    DoctorsListService service = new DoctorsListService();

    if (await widget.sharedPref.getObject(USER_PROFILE) != null) {
      var data = AuthenticatedUser.fromJson(await widget.sharedPref.getObject(USER_PROFILE));
      setState(() {
        widget.authUser = data;
      });
    }

    ConfirmDialog dialog = new ConfirmDialog(
        context: context,
        confirmMessage: "Send a copy of this QR to the email " + widget.authUser!.emailAddress! + "?",
        okText: TranslationBase.of(context).confirm,
        cancelText: TranslationBase.of(context).cancel_nocaps,
        okFunction: () {
          GifLoaderDialogUtils.showMyDialog(context);
          service
              .sendAppointmentQREmail(
                  widget.authUser!.emailAddress!,
                  widget.patientShareResponse!.appointmentDate!,
                  widget.patientShareResponse!.appointmentNo!.toString(),
                  //Changed By Aamir
                  widget.patientShareResponse!.doctorNameObj,
                  widget.patientShareResponse!.projectName,
                  widget.appoQR!,
                  getDoctorSpeciality(widget.patientShareResponse!.doctorSpeciality as List<String>),
                  context)
              .then((res) {
            GifLoaderDialogUtils.hideDialog(context);
            ConfirmDialog.closeAlertDialog(context);
          }).catchError((err) {
            ConfirmDialog.closeAlertDialog(context);
            GifLoaderDialogUtils.hideDialog(context);
            AppToast.showErrorToast(message: err);
            print(err);
          });
        },
        cancelFunction: () => {});
    dialog.showAlertDialog(context);
  }

  Future navigateToHome(context) async {
    Navigator.of(context).pushNamed(HOME);
  }

  getPatientShare(context, String appointmentNo, int clinicID, int projectID, DoctorList docObject) {}

  String getDate(String appoDate) {
    var appoDateFormatted = "";

    var dateObj = DateUtil.convertStringToDate(appoDate);

    setState(() {
      appoDateFormatted = DateUtil.getWeekDay(dateObj.weekday) +
          ", " +
          dateObj.day.toString() +
          " " +
          DateUtil.getMonth(dateObj.month) +
          " " +
          dateObj.year.toString() +
          ", " +
          dateObj.hour.toString() +
          ":" +
          dateObj.minute.toString() +
          ":00";
    });

    return appoDateFormatted;
  }

  String getDoctorSpeciality(List<String> docSpecial) {
    String docSpeciality = "";
    if (docSpecial != null && docSpecial.length != 0) {
      docSpecial.forEach((v) {
        docSpeciality = docSpeciality + v + "\n";
      });
    }
    return docSpeciality;
  }

  sendNfcCheckInRequest(String nfcId, int checkInBy) {
    GifLoaderDialogUtils.showMyDialog(context);

    DoctorsListService service = new DoctorsListService();

    service.sendCheckinNfcRequest(widget!.patientShareResponse!.appointmentNo!, nfcId, widget.patientShareResponse!.projectID!, checkInBy, widget.patientShareResponse!.clinicID!, context).then((res) {
      print(res);
      GifLoaderDialogUtils.hideDialog(context);
      _showMyDialog(res["SuccessMsg"], this.context);
    }).catchError((err) {
      GifLoaderDialogUtils.hideDialog(context);
      print(err);
      _showMyDialog(err, this.context);
    });
  }

  Future<void> _showMyDialog(String message, BuildContext context) async {
    return showDialog<void>(
      context: context,
      barrierDismissible: true, // user must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('Alert'),
          content: SingleChildScrollView(
            child: ListBody(
              children: <Widget>[
                Text(message),
              ],
            ),
          ),
          actions: <Widget>[
            TextButton(
              child: const Text('OK'),
              onPressed: () {
                Navigator.of(context).pop();
                Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context) => LandingPage()), (Route<dynamic> r) => false);
              },
            ),
          ],
        );
      },
    );
  }
}
