import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/models/Appointments/PatientShareResposne.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/pages/BookAppointment/QRCode.dart';
import 'package:diplomaticquarterapp/pages/MyAppointments/AppointmentDetails.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/payment_method_select.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/widgets/paymentDialog.dart';
import 'package:diplomaticquarterapp/services/appointment_services/GetDoctorsList.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/widgets/in_app_browser/InAppBrowser.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:rating_bar/rating_bar.dart';
import 'package:smart_progress_bar/smart_progress_bar.dart';

class ToDo extends StatefulWidget {
  PatientShareResponse patientShareResponse;
  List<AppoitmentAllHistoryResultList> appoList = [];
  var languageID;
  MyInAppBrowser browser;

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

class _ToDoState extends State<ToDo> {
  AppSharedPreferences sharedPref = AppSharedPreferences();

  AuthenticatedUser authUser;
  AuthProvider authProvider = new AuthProvider();

  @override
  void initState() {
//    authUser = authProvider.getAuthenticatedUser();
    print("initState!!!!!");
    widget.patientShareResponse = new PatientShareResponse();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => getPatientAppointmentHistory());
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return AppScaffold(
      appBarTitle: TranslationBase.of(context).todoList,
      body: SingleChildScrollView(
        child: Container(
          child: ListView.builder(
            scrollDirection: Axis.vertical,
            shrinkWrap: true,
            physics: ScrollPhysics(),
            padding: EdgeInsets.all(0.0),
            itemCount: widget.appoList.length,
            itemBuilder: (context, index) {
              return Container(
                margin: EdgeInsets.all(10.0),
                child: Card(
                  margin: EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 8.0),
                  color: Colors.white,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(10),
                  ),
                  child: Container(
                    width: MediaQuery.of(context).size.width,
                    padding: EdgeInsets.all(10.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      mainAxisSize: MainAxisSize.max,
                      children: <Widget>[
                        Row(
                          children: <Widget>[
                            Image.asset(
                                "assets/images/new-design/time_icon.png",
                                width: 20.0,
                                height: 20.0),
                            Container(
                              margin: EdgeInsets.only(left: 10.0, right: 30.0),
                              child: Text(
                                  getDate(
                                      widget.appoList[index].appointmentDate),
                                  style: TextStyle(fontSize: 12.0)),
                            ),
                            Image.asset(
                                "assets/images/new-design/hospital_address_icon.png",
                                width: 20.0,
                                height: 20.0),
                            Container(
                              margin: EdgeInsets.only(left: 10.0, right: 10.0),
                              child: Text(widget.appoList[index].projectName,
                                  style: TextStyle(fontSize: 12.0)),
                            ),
                          ],
                        ),
                        Container(
                          margin: EdgeInsets.only(top: 5.0),
                          child: Divider(
                            color: Colors.grey[500],
                          ),
                        ),
                        Flex(
                          direction: Axis.horizontal,
                          children: <Widget>[
                            Expanded(
                              flex: 1,
                              child: Container(
                                height:
                                    MediaQuery.of(context).size.height * 0.1,
                                margin: EdgeInsets.only(top: 5.0),
                                child: ClipRRect(
                                  borderRadius: BorderRadius.circular(100.0),
                                  child: Image.network(
                                      widget.appoList[index].doctorImageURL,
                                      fit: BoxFit.fill),
                                ),
                              ),
                            ),
                            Expanded(
                              flex: 3,
                              child: Container(
                                margin: EdgeInsets.only(
                                    top: 20.0, left: 20.0, right: 20.0),
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                        widget.appoList[index].doctorTitle +
                                            " " +
                                            widget
                                                .appoList[index].doctorNameObj,
                                        style: TextStyle(
                                            fontSize: 14.0,
                                            color: Colors.black,
                                            fontWeight: FontWeight.bold,
                                            letterSpacing: 1.0)),
                                    Container(
                                      margin: EdgeInsets.only(
                                          top: 3.0, bottom: 3.0),
                                      child: Text(
                                          getDoctorSpeciality(widget
                                                  .appoList[index]
                                                  .doctorSpeciality)
                                              .trim(),
                                          style: TextStyle(
                                              fontSize: 12.0,
                                              color: Colors.grey[600],
                                              letterSpacing: 1.0)),
                                    ),
                                    Row(
                                      mainAxisAlignment:
                                          MainAxisAlignment.spaceBetween,
                                      mainAxisSize: MainAxisSize.max,
                                      children: <Widget>[
                                        RatingBar.readOnly(
                                          initialRating: widget
                                              .appoList[index].actualDoctorRate
                                              .toDouble(),
                                          size: 20.0,
                                          filledColor: Colors.yellow[700],
                                          emptyColor: Colors.grey[500],
                                          isHalfAllowed: true,
                                          halfFilledIcon: Icons.star_half,
                                          filledIcon: Icons.star,
                                          emptyIcon: Icons.star,
                                        ),
                                      ],
                                    ),
                                  ],
                                ),
                              ),
                            ),
                            Expanded(
                              flex: 1,
                              child: InkWell(
                                onTap: () =>
                                    performNextAction(widget.appoList[index]),
                                child: Container(
                                  margin: EdgeInsets.only(top: 20.0),
                                  child: Column(
                                    children: <Widget>[
                                      Image.asset(
                                          getNextActionImage(widget
                                              .appoList[index].nextAction),
                                          width: 50.0,
                                          height: 50.0),
                                      Container(
                                        margin: EdgeInsets.only(top: 5.0),
                                        child: Text(
                                            getNextActionText(widget
                                                .appoList[index].nextAction),
                                            textAlign: TextAlign.center,
                                            style: TextStyle(fontSize: 12.0)),
                                      )
                                    ],
                                  ),
                                ),
                              ),
                            )
                          ],
                        ),
                        Divider(
                          color: Colors.grey[500],
                        ),
                        Flex(
                          direction: Axis.horizontal,
                          children: <Widget>[
                            Expanded(
                              flex: 2,
                              child: Container(
                                child: Text(
                                    getNextActionDescription(
                                        widget.appoList[index].nextAction),
                                    style: TextStyle(
                                        fontSize: 12.0,
                                        color: Colors.grey[700])),
                              ),
                            ),
                            Expanded(
                              flex: 1,
                              child: GestureDetector(
                                onTap: () {
                                  navigateToAppointmentDetails(
                                      context, widget.appoList[index]);
                                },
                                child: Container(
                                  child: Text(
                                      TranslationBase.of(context)
                                          .upcomingDetails,
                                      textAlign: TextAlign.end,
                                      style: TextStyle(
                                          fontSize: 12.0,
                                          color: Colors.red[600],
                                          decoration:
                                              TextDecoration.underline)),
                                ),
                              ),
                            )
                          ],
                        ),
                      ],
                    ),
                  ),
                ),
              );
            },
          ),
        ),
      ),
    );
  }

  String getNextActionImage(nextAction) {
    switch (nextAction) {
      case 0:
        return "No Action";
        break;
      case 10:
        return "assets/images/new-design/confirm_button.png";
        break;

      case 15:
        return widget.languageID == 'ar'
            ? "assets/images/new-design/pay_online_button_arabic_disabled.png"
            : "assets/images/new-design/pay_online_button_disabled.png";
        break;

      case 20:
        return widget.languageID == 'ar'
            ? "assets/images/new-design/pay_online_button_arabic.png"
            : "assets/images/new-design/pay_online_button.png";
        break;

      case 30:
        return "assets/images/new-design/qr_code_button.png";
        break;

      case 40:
        return "assets/images/new-design/video_call_instruction.png";
        break;

      case 50:
        return "assets/images/new-design/liveCare_logo_icon.png";
        break;

      default:
        return "";
    }
  }

  performNextAction(AppoitmentAllHistoryResultList appo) {
    switch (appo.nextAction) {
      case 10:
        confirmAppointment(appo);
        break;

      case 20:
        getPatientShare(context, appo);
        break;

      case 30:
        getAppoQR(context, appo);
        break;
    }
  }

  String getNextActionText(nextAction) {
    switch (nextAction) {
      case 0:
        return "No Action";
        break;
      case 10:
        return TranslationBase.of(context).confirm;
        break;

      case 15:
        return TranslationBase.of(context).pendingPayment;
        break;

      case 20:
        return TranslationBase.of(context).payNow;
        break;

      case 30:
        return TranslationBase.of(context).viewQR;
        break;

      case 40:
        return TranslationBase.of(context).instruction;
        break;

      case 50:
        return TranslationBase.of(context).livecare;
        break;

      default:
        return "";
    }
  }

  String getNextActionDescription(nextAction) {
    switch (nextAction) {
      case 0:
        return "No Action";
        break;
      case 10:
        return TranslationBase.of(context).upcomingConfirm;
        break;

      case 15:
        return TranslationBase.of(context).upcomingPaymentPending;
        break;

      case 20:
        return TranslationBase.of(context).upcomingPaymentNow;
        break;

      case 30:
        return TranslationBase.of(context).upcomingQR;
        break;

      case 40:
        return TranslationBase.of(context).upcomingVirtual;
        break;

      case 50:
        return TranslationBase.of(context).upcomingLivecare;
        break;

      default:
        return "";
    }
  }

  getLanguageID() async {
    var languageID = await sharedPref.getString(APP_LANGUAGE);
    setState(() {
      widget.languageID = languageID;
    });
  }

  String getDate(String date) {
    DateTime dateObj = DateUtil.convertStringToDate(date);
    return DateUtil.getWeekDay(dateObj.weekday) +
        ", " +
        dateObj.day.toString() +
        " " +
        DateUtil.getMonth(dateObj.month) +
        " " +
        dateObj.year.toString() +
        " " +
        dateObj.hour.toString() +
        ":" +
        getMinute(dateObj);
  }

  String getMinute(DateTime dateObj) {
    if (dateObj.minute == 0) {
      return dateObj.minute.toString() + "0";
    } else {
      return dateObj.minute.toString();
    }
  }

  String getDoctorSpeciality(List<String> docSpecial) {
    String docSpeciality = "";
    docSpecial.forEach((v) {
      docSpeciality = docSpeciality + v + "\n";
    });
    return docSpeciality;
  }

  Future navigateToAppointmentDetails(context, appo) async {
    Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) => AppointmentDetails(appo: appo)))
        .then((value) {
      getPatientAppointmentHistory();
    });
  }

  getPatientAppointmentHistory() {
    DoctorsListService service = new DoctorsListService();
    service.getPatientAppointmentHistory(true, context).then((res) {
      print(res['AppoimentAllHistoryResultList']);
      if (res['MessageStatus'] == 1) {
        setState(() {
          if (res['AppoimentAllHistoryResultList'].length != 0) {
            widget.appoList.clear();
            res['AppoimentAllHistoryResultList'].forEach((v) {
              widget.appoList
                  .add(new AppoitmentAllHistoryResultList.fromJson(v));
            });
          } else {}
        });
      } else {
        AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
      }
    }).catchError((err) {
      print(err);
      AppToast.showErrorToast(message: err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  getPatientShare(context, AppoitmentAllHistoryResultList appo) {
    DoctorsListService service = new DoctorsListService();
    service
        .getPatientShare(appo.appointmentNo.toString(), appo.clinicID,
            appo.projectID, context)
        .then((res) {
      widget.patientShareResponse = new PatientShareResponse.fromJson(res);
      openPaymentDialog(appo, widget.patientShareResponse);
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  getAppoQR(context, AppoitmentAllHistoryResultList appo) {
    PatientShareResponse patientShareResponse = new PatientShareResponse();

    patientShareResponse.doctorNameObj = appo.doctorNameObj;
    patientShareResponse.doctorSpeciality = appo.doctorSpeciality;
    patientShareResponse.projectName = appo.projectName;
    patientShareResponse.appointmentDate = appo.appointmentDate;
    patientShareResponse.appointmentNo = appo.appointmentNo;
    patientShareResponse.clinicID = appo.clinicID;
    patientShareResponse.projectID = appo.projectID;
    patientShareResponse.isFollowup = appo.isFollowup;

    DoctorsListService service = new DoctorsListService();
    service.generateAppointmentQR(patientShareResponse, context).then((res) {
      print(res);
      navigateToQR(context, res['AppointmentQR'], patientShareResponse);
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  Future navigateToQR(
      context, String appoQR, PatientShareResponse patientShareResponse) async {
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => QRCode(
                  patientShareResponse: patientShareResponse,
                  appoQR: appoQR,
                ))).then((value) {
      getPatientAppointmentHistory();
    });
  }

  openPaymentDialog(AppoitmentAllHistoryResultList appo,
      PatientShareResponse patientShareResponse) {
    showGeneralDialog(
            barrierColor: Colors.black.withOpacity(0.5),
            transitionBuilder: (context, a1, a2, widget) {
              final curvedValue =
                  Curves.easeInOutBack.transform(a1.value) - 1.0;
              return Transform(
                transform:
                    Matrix4.translationValues(0.0, curvedValue * 200, 0.0),
                child: Opacity(
                  opacity: a1.value,
                  child: PaymentDialog(
                      appo: appo, patientShareResponse: patientShareResponse),
                ),
              );
            },
            transitionDuration: Duration(milliseconds: 500),
            barrierDismissible: false,
            barrierLabel: '',
            context: context,
            pageBuilder: (context, animation1, animation2) {})
        .then((value) {
      print(value);

      if (value != null) {
        navigateToPaymentMethod(context, value, appo);
      }
    });
  }

  openPayment(
      String paymentMethod,
      AuthenticatedUser authenticatedUser,
      double amount,
      PatientShareResponse patientShareResponse,
      AppoitmentAllHistoryResultList appo) {
    widget.browser = new MyInAppBrowser(
        onExitCallback: onBrowserExit,
        appo: appo,
        onLoadStartCallback: onBrowserLoadStart);

    widget.browser.openPaymentBrowser(
        amount,
        "Appointment check in",
        Utils.getAppointmentTransID(
            appo.projectID, appo.clinicID, appo.appointmentNo),
        appo.projectID.toString(),
        authenticatedUser.emailAddress,
        paymentMethod,
        authenticatedUser,
        widget.browser);
  }

  onBrowserLoadStart(String url) {
    print("onBrowserLoadStart");
    print(url);

    MyInAppBrowser.successURLS.forEach((element) {
      if (url.contains(element)) {
        if (widget.browser.isOpened()) widget.browser.close();
        MyInAppBrowser.isPaymentDone = true;
        return;
      }
    });

    MyInAppBrowser.errorURLS.forEach((element) {
      if (url.contains(element)) {
        if (widget.browser.isOpened()) widget.browser.close();
        MyInAppBrowser.isPaymentDone = false;
        return;
      }
    });
  }

  onBrowserExit(AppoitmentAllHistoryResultList appo, bool isPaymentMade) {
    print("onBrowserExit Called!!!!");
    if (isPaymentMade) checkPaymentStatus(appo);
  }

  checkPaymentStatus(AppoitmentAllHistoryResultList appo) {
    DoctorsListService service = new DoctorsListService();
    service
        .checkPaymentStatus(
            Utils.getAppointmentTransID(
                appo.projectID, appo.clinicID, appo.appointmentNo),
            context)
        .then((res) {
      print("Printing Payment Status Reponse!!!!");
      print(res);
      String paymentInfo = res['Response_Message'];
      if (paymentInfo == 'Success') {
        createAdvancePayment(res, appo);
      } else {
        AppToast.showErrorToast(message: res['Response_Message']);
      }
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  createAdvancePayment(res, AppoitmentAllHistoryResultList appo) {
    DoctorsListService service = new DoctorsListService();
    String paymentReference = res['Fort_id'].toString();
    service
        .createAdvancePayment(
            appo, res['Amount'], res['Fort_id'], res['PaymentMethod'], context)
        .then((res) {
      print(res['OnlineCheckInAppointments'][0]['AdvanceNumber']);
      addAdvancedNumberRequest(
          res['OnlineCheckInAppointments'][0]['AdvanceNumber'].toString(),
          paymentReference,
          appo.appointmentNo.toString(),
          appo);
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  addAdvancedNumberRequest(String advanceNumber, String paymentReference,
      String appointmentID, AppoitmentAllHistoryResultList appo) {
    DoctorsListService service = new DoctorsListService();
    service
        .addAdvancedNumberRequest(
            advanceNumber, paymentReference, appointmentID, context)
        .then((res) {
      print(res);
      getAppoQR(context, appo);
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }

  Future navigateToPaymentMethod(
      context,
      PatientShareResponse patientShareResponse,
      AppoitmentAllHistoryResultList appo) async {
    if (await this.sharedPref.getObject(USER_PROFILE) != null) {
      var data = AuthenticatedUser.fromJson(
          await this.sharedPref.getObject(USER_PROFILE));
      setState(() {
        authUser = data;
      });
    }

    Navigator.push(
            context, MaterialPageRoute(builder: (context) => PaymentMethod()))
        .then((value) {
      print(value);
      getPatientAppointmentHistory();

      if (value != null) {
        openPayment(
            value,
            authUser,
            double.parse(patientShareResponse.patientShareWithTax.toString()),
            patientShareResponse,
            appo);
      }
    });
  }

  confirmAppointment(AppoitmentAllHistoryResultList appo) {
    DoctorsListService service = new DoctorsListService();
    service
        .confirmAppointment(
            appo.appointmentNo, appo.clinicID, appo.projectID, context)
        .then((res) {
      if (res['MessageStatus'] == 1) {
        AppToast.showSuccessToast(message: res['ErrorEndUserMessage']);
        getPatientAppointmentHistory();
      } else {
        AppToast.showErrorToast(message: res['ErrorEndUserMessage']);
      }
    }).catchError((err) {
      print(err);
    }).showProgressBar(text: "Loading", backgroundColor: Colors.blue.withOpacity(0.6));
  }
}
