Untitled

mail@pastecode.io avatar
unknown
dart
a year ago
38 kB
1
Indexable
Never
import 'dart:convert';
import 'dart:developer';

import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_paytabs_bridge/BaseBillingShippingInfo.dart';
import 'package:flutter_paytabs_bridge/IOSThemeConfiguration.dart';
import 'package:flutter_paytabs_bridge/PaymentSdkApms.dart';
import 'package:flutter_paytabs_bridge/PaymentSdkConfigurationDetails.dart';
import 'package:flutter_paytabs_bridge/PaymentSdkTokeniseType.dart';
import 'package:flutter_paytabs_bridge/flutter_paytabs_bridge.dart';
import 'package:foot_fit/common_class/md_extension.dart';
import 'package:foot_fit/view/home_view/our_services/order_submit_view.dart';
import 'package:foot_fit/view/home_view/our_services/use_point_view.dart';
import 'package:paymob_flutter_lib/models/payment.dart';
import 'package:paymob_flutter_lib/models/payment_result.dart';
import 'package:paymob_flutter_lib/paymob_flutter_lib.dart';

import '../../../common_class/md_color_extension.dart';
import '../../../common_class/md_globs.dart';
import '../../../common_class/md_service_call.dart';
import '../../common_widget/popup_layout.dart';
import '../../common_widget/round_button.dart';

class CheckOutView extends StatefulWidget {
  final Map bObj;
  final Map sObj;

  const CheckOutView({super.key, required this.bObj, required this.sObj});

  @override
  State<CheckOutView> createState() => _CheckOutViewState();
}

class _CheckOutViewState extends State<CheckOutView> {
  final _paymobFlutterLibPlugin = PaymobFlutterLib();
  TextEditingController txtPromoCode = TextEditingController();

  List<Map> periodArr = [
    {"name": "1 Day", "value": "1 Day", "value_key": "one_date_"},
    {"name": "1 Month", "value": "1 Month", "value_key": "one_month_"},
    {"name": "3 Month", "value": "3 Month", "value_key": "three_month_"},
    {"name": "6 Month", "value": "6 Month", "value_key": "six_month_"},
    {"name": "1 Year", "value": "1 Year", "value_key": "year_month_"}
  ];

  List<Map> weekArr = [
    {
      "name": "2",
      "value": "2",
      "value_key": "session_two_price",
      "point_key": "session_two_point",
    },
    {
      "name": "3",
      "value": "3",
      "value_key": "session_three_price",
      "point_key": "session_three_point",
    },
    {
      "name": "4",
      "value": "4",
      "value_key": "session_four_price",
      "point_key": "session_four_point",
    },
    {
      "name": "Unlimited",
      "value": "Unlimited",
      "value_key": "session_unlimited_price",
      "session_key": "unlimited_total_session",
      "point_key": "session_unlimited_point",
    }
  ];

  Map? selectPeriod;
  Map? selectWeek;

  bool isApplyCode = false;

  Map promoDic = {};

  @override
  void initState() {
    super.initState();
    selectPeriod = periodArr.first;
    selectWeek = {
      "name": "1",
      "value": "1",
      "value_key": "session_price",
      "point_key": "session_point",
    };
    MDServiceCall.fireEvent(Event.checkout);
  }

  @override
  Widget build(BuildContext context) {
    var media = MediaQuery.of(context).size;
    var rowSpace = media.width * 0.012;

    var price = double.tryParse(
            "${widget.sObj["${selectPeriod?["value_key"] ?? ""}${selectWeek?["value_key"] ?? ""}"] ?? "0.0"}") ??
        0.0;
    var disPrice = double.tryParse("${promoDic[KKey.amount]} ") ?? 0.0;

    //price
    var displayPrice = isApplyCode ? (price - disPrice) : price;
    List<dynamic> daysOpened = (widget.bObj[KKey.schedule] as List? ?? [])
        .where((element) => element[KKey.openClose] != 0)
        .toList();

    return Scaffold(
      appBar: AppBar(
        titleSpacing: 0,
        elevation: 2,
        backgroundColor: Colors.white,
        leading: IconButton(
            onPressed: () {
              Navigator.pop(context);
            },
            padding: EdgeInsets.zero,
            icon: const Icon(
              Icons.arrow_back,
              color: Colors.black,
            )),
        title: Text(
          'Check Out'.tr(),
          style: const TextStyle(
              fontFamily: "Geogrotesque Cyr",
              fontWeight: FontWeight.bold,
              fontSize: 25,
              color: Colors.black),
        ),
      ),
      // AppBarView(
      //   leftIcon: 'assets/img/back.png',
      //   leftAction: () {
      //     Navigator.of(context).pop();
      //   },
      //   leftIconWidth: 15,
      //   title: Text(
      //     "Check Out".tr(),
      //     textAlign: TextAlign.center,
      //   ),
      // ),
      backgroundColor: TColor.bg,
      body: SingleChildScrollView(
        child: Column(children: [
          Container(
              padding: const EdgeInsets.symmetric(horizontal: 24),
              width: media.width,
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Padding(
                    padding: const EdgeInsets.only(top: 28),
                    child: Text(
                      "Days".tr(),
                      textAlign: isEN ? TextAlign.left : TextAlign.right,
                      style: TextStyle(
                          color: TColor.primaryText,
                          fontSize: 20,
                          fontWeight: FontWeight.w500),
                    ),
                  ),

                  const SizedBox(height: 16),

                  // ChipsChoice<int>.single(
                  //             value: 0,
                  //             wrapped: true,
                  //             padding: EdgeInsets.zero,
                  //             spacing: 4,
                  //             runSpacing: 0,
                  //             choiceStyle:

                  //             C2ChipStyle(
                  //               backgroundOpacity: 1,
                  //               backgroundColor: TColor.primary,

                  //               margin: EdgeInsets.zero,
                  //               elevation: 0,

                  //               foregroundStyle: const TextStyle(fontSize: 13),
                  //               borderRadius:  BorderRadius.circular(20)

                  //               // elevation: 0,
                  //             ),
                  //             onChanged: (val) {},
                  //             choiceItems: C2Choice.listFrom<int, dynamic>(
                  //               source: [{"name":"Monday", "id":1 }],
                  //               value: (i, v) => int.tryParse("${v[KKey.id] ?? "0"}") ?? 0,
                  //               label: (i, e) => "${e[KKey.name] ?? ""}".tr(),
                  //             ),
                  //           ),

                  // Column(
                  //   children: (widget.bObj[KKey.schedule] as List? ?? [])
                  //       .map((obj) {
                  //     var isClose = (obj[KKey.openClose] as int? ?? 0) == 0;
                  //
                  //     return Padding(
                  //       padding: EdgeInsets.symmetric(vertical: rowSpace),
                  //       child: Row(
                  //         mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  //         children: [
                  //           SizedBox(
                  //             width: 80,
                  //             child: Text(
                  //               obj[KKey.lName] as String? ?? "",
                  //               textAlign:
                  //                   isEN ? TextAlign.left : TextAlign.right,
                  //               style: TextStyle(
                  //                   fontFamily: "Geogrotesque Cyr",
                  //                   fontWeight: FontWeight.bold,
                  //                   fontSize: 14,
                  //                   color: TColor.primaryText),
                  //             ),
                  //           ),
                  //           Expanded(
                  //             child: Text(
                  //               isClose
                  //                   ? "Closed".tr()
                  //                   : "${obj[KKey.startHour] as String? ?? ""} - ${obj[KKey.endHour] as String? ?? ""}",
                  //               maxLines: 1,
                  //               textAlign: TextAlign.center,
                  //               style: TextStyle(
                  //                   color: TColor.primaryText,
                  //                   fontSize: 13,
                  //                   fontWeight: FontWeight.w500),
                  //             ),
                  //           ),
                  //           Expanded(
                  //             child: Text(
                  //               isClose
                  //                   ? ""
                  //                   : "${obj[KKey.startHourTwo] as String? ?? ""} - ${obj[KKey.endHourTwo] as String? ?? ""}",
                  //               maxLines: 1,
                  //               textAlign: TextAlign.center,
                  //               style: TextStyle(
                  //                   color: TColor.primaryText,
                  //                   fontSize: 13,
                  //                   fontWeight: FontWeight.w500),
                  //             ),
                  //           ),
                  //         ],
                  //       ),
                  //     );
                  //   }).toList(),
                  // ),

                  GridView.count(
                    shrinkWrap: true,
                    // Create a grid with 2 columns. If you change the scrollDirection to
                    // horizontal, this produces 2 rows.
                    crossAxisCount: 2,
                    physics: const NeverScrollableScrollPhysics(),
                    crossAxisSpacing: 20,
                    childAspectRatio: (16 / 6),
                    // Generate 100 widgets that display their index in the List.
                    children: List.generate(daysOpened.length, (index) {
                      log('messagesssdd ${daysOpened[index]}');
                      return Container(
                        padding: const EdgeInsets.symmetric(horizontal: 16),
                        decoration: BoxDecoration(
                            color: const Color(0xff919191).withOpacity(0.2),
                            borderRadius: BorderRadius.circular(4)),
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            Text(
                              daysOpened[index][KKey.lName] as String? ?? "",
                              maxLines: 1,
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                  color: TColor.primaryText,
                                  fontSize: 16,
                                  fontWeight: FontWeight.w500),
                            ),
                            Text(
                              "${daysOpened[index][KKey.startHour] as String? ?? ""} - ${daysOpened[index][KKey.endHour] as String? ?? ""}",
                              maxLines: 1,
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                  color: TColor.primaryText,
                                  fontSize: 14,
                                  fontWeight: FontWeight.w500),
                            ),
                          ],
                        ),
                      );
                    }),
                  ),

                  const SizedBox(height: 28),

                  Text(
                    '${"Period".tr()} 🗓️',
                    textAlign: isEN ? TextAlign.left : TextAlign.right,
                    style: TextStyle(
                        color: TColor.primaryText,
                        fontSize: 20,
                        fontWeight: FontWeight.w500),
                  ),

                  const SizedBox(height: 14),

                  Row(
                    // mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: periodArr.map((obj) {
                      var isSelected = obj == selectPeriod;

                      return Padding(
                        padding: const EdgeInsets.symmetric(horizontal: 3.0),
                        child: GestureDetector(
                          onTap: () {
                            setState(() {
                              if (selectPeriod == periodArr.first &&
                                  obj != periodArr.first) {
                                selectWeek = null;
                              }

                              selectPeriod = obj;

                              if (selectPeriod == periodArr.first) {
                                selectWeek = {
                                  "name": "1",
                                  "value": "1",
                                  "value_key": "session_price",
                                  "point_key": "session_point",
                                };
                              }

                              selectWeek ??= weekArr.first;
                            });
                          },
                          child: Container(
                            width: media.width * 0.16,
                            height: media.width * 0.16,
                            alignment: Alignment.center,
                            // padding: EdgeInsets.all(media.width * 0.01),
                            decoration: BoxDecoration(
                              color: isSelected
                                  ? TColor.primary
                                  : TColor.wTextColor,
                              borderRadius: BorderRadius.circular(10),
                              // boxShadow: const [
                              //   BoxShadow(
                              //       blurRadius: 3,
                              //       spreadRadius: 1,
                              //       color: Colors.black26)
                              // ],
                            ),
                            child: Text(
                              (obj["name"] as String? ?? "").tr(),
                              textAlign: TextAlign.center,
                              style: TextStyle(
                                  color: isSelected
                                      ? TColor.primaryText
                                      : Colors.black,
                                  fontSize: 16,
                                  fontWeight: FontWeight.w500),
                            ),
                          ),
                        ),
                      );
                    }).toList(),
                  ),

                  const SizedBox(height: 28),

                  Text(
                    "Sessions / Week".tr(),
                    textAlign: isEN ? TextAlign.left : TextAlign.right,
                    style: TextStyle(
                        color: TColor.primaryText,
                        fontSize: 16,
                        fontWeight: FontWeight.w500),
                  ),

                  Padding(
                    padding: const EdgeInsets.only(top: 16),
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: weekArr.map((obj) {
                        var isSelected = obj == selectWeek;
                        var isDisable = selectPeriod == null ||
                            selectPeriod == periodArr.first;

                        return Padding(
                          padding: const EdgeInsets.symmetric(horizontal: 3),
                          child: GestureDetector(
                            onTap: () {
                              if (isDisable) {
                                return;
                              }

                              setState(() {
                                selectWeek = obj;
                              });
                            },
                            child: Container(
                              width: media.width * 0.17,
                              height: media.width * 0.17,
                              alignment: Alignment.center,
                              // padding: EdgeInsets.all(media.width * 0.01),
                              decoration: BoxDecoration(
                                color: isDisable
                                    ? const Color(0xff919191).withOpacity(0.2)
                                    : isSelected
                                        ? TColor.primary
                                        : Colors.white,
                                borderRadius: BorderRadius.circular(10),
                              ),
                              child: Text(
                                (obj["name"] as String? ?? "").tr(),
                                textAlign: TextAlign.center,
                                style: TextStyle(
                                    color: TColor.primaryText,
                                    fontSize: 14,
                                    fontWeight: FontWeight.w500),
                              ),
                            ),
                          ),
                        );
                      }).toList(),
                    ),
                  ),
                ],
              )),
          Container(
            width: media.width,
            padding: const EdgeInsets.only(left: 24, right: 24, top: 28),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  'Subscription amount'.tr(),
                  style: TextStyle(
                      color: TColor.primaryText,
                      fontSize: 20,
                      fontWeight: FontWeight.w500),
                ),
                Text(
                  "Final total includes Tax Or any other text (Optional)".tr(),
                  textAlign: isEN ? TextAlign.left : TextAlign.right,
                  style: TextStyle(
                      color: TColor.primaryText,
                      fontSize: 14,
                      fontWeight: FontWeight.w500),
                ),
                promoCodeWidget(),
                // InnerTextField(
                //   controller: txtPromoCode,
                //   hintText: "Promo Code",
                //   right: TextButton(
                //     onPressed: () {
                //       goPromoCode();
                //     },
                //     child: Text(
                //       (isApplyCode ? "Remove" : "Apply").tr(),
                //       style: const TextStyle(
                //           fontSize: 18, fontWeight: FontWeight.bold),
                //     ),
                //   ),
                // ),
                const SizedBox(height: 24),
                Visibility(
                  visible: isApplyCode,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Text(
                        "Total".tr(),
                        textAlign: isEN ? TextAlign.left : TextAlign.right,
                        style: TextStyle(
                            color: TColor.primaryText,
                            fontSize: 16,
                            fontWeight: FontWeight.w700),
                      ),
                      Text(
                        "${price.toStringAsFixed(2)} ${widget.bObj[KKey.currency] ?? "USD"}",
                        textAlign: isEN ? TextAlign.left : TextAlign.right,
                        style: TextStyle(
                            color: TColor.primaryText,
                            fontSize: 16,
                            fontWeight: FontWeight.w700),
                      ),
                    ],
                  ),
                ),
                Visibility(
                  visible: isApplyCode,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      Text(
                        "Promo Code Applied Price".tr(),
                        textAlign: isEN ? TextAlign.left : TextAlign.right,
                        style: TextStyle(
                            color: TColor.primaryText,
                            fontSize: 16,
                            fontWeight: FontWeight.w700),
                      ),
                      Text(
                        "-${disPrice.toStringAsFixed(2)} ${widget.bObj[KKey.currency] ?? "USD"}",
                        textAlign: isEN ? TextAlign.left : TextAlign.right,
                        style: TextStyle(
                            color: TColor.primaryText,
                            fontSize: 16,
                            fontWeight: FontWeight.w700),
                      ),
                    ],
                  ),
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Text(
                      "Payable Amount".tr(),
                      textAlign: isEN ? TextAlign.left : TextAlign.right,
                      style: TextStyle(
                          color: TColor.primaryText,
                          fontSize: 16,
                          fontWeight: FontWeight.w700),
                    ),
                    Text(
                      "${displayPrice.toStringAsFixed(2)} ${widget.bObj[KKey.currency] ?? "USD"}",
                      textAlign: isEN ? TextAlign.left : TextAlign.right,
                      style: TextStyle(
                          color: TColor.primaryText,
                          fontSize: 16,
                          fontWeight: FontWeight.w700),
                    ),
                  ],
                ),
                // SizedBox(
                //   height: media.width * 0.01,
                // ),
                // Text(
                //   "Final total includes Tax Or any other text (Optional)".tr(),
                //   textAlign: isEN ? TextAlign.left : TextAlign.right,
                //   style: TextStyle(
                //       color: TColor.primaryText,
                //       fontSize: 14,
                //       fontWeight: FontWeight.w500),
                // ),
                const SizedBox(height: 24),
                Row(
                  children: [
                    Visibility(
                      visible:
                          "${widget.bObj[KKey.isPaymentPoint] ?? "0"}" == "1",
                      child: Expanded(
                        child: RoundButton(
                          title: "Points",
                          shapeBorder: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(16),
                          ),
                          type: RoundButtonType.primary,
                          onPressed: () {
                            goSubmitPoint(displayPrice);
                          },
                        ),
                      ),
                    ),
                    SizedBox(
                      width: ("${widget.bObj[KKey.isPaymentPoint] ?? "0"}" ==
                                  "1") &&
                              ("${widget.bObj[KKey.isPaymentCash] ?? "0"}" ==
                                  "1")
                          ? media.width * 0.03
                          : 0,
                    ),
                    Visibility(
                      visible:
                          "${widget.bObj[KKey.isPaymentCash] ?? "0"}" == "1",
                      child: Expanded(
                        child: RoundButton(
                          title: "Cash",
                          shapeBorder: RoundedRectangleBorder(
                            borderRadius: BorderRadius.circular(16),
                          ),
                          type: RoundButtonType.primary,
                          onPressed: () {
                            goSubmit("cash");
                          },
                        ),
                      ),
                    ),
                  ],
                ),
                SizedBox(
                  height: ("${widget.bObj[KKey.isPaymentPoint] ?? "0"}" ==
                              "1") ||
                          ("${widget.bObj[KKey.isPaymentCash] ?? "0"}" == "1")
                      ? media.width * 0.03
                      : 0,
                ),
                Visibility(
                    visible:
                        "${widget.bObj[KKey.isPaymentOnline] ?? "0"}" == "1",
                    child: RoundButton(
                      title: "Online Payment",
                      shapeBorder: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(16),
                      ),
                      type: RoundButtonType.primary,
                      onPressed: () {
                        goSubmit("online");
                      },
                    )),
                const SizedBox(height: 24),
              ],
            ),
          )
        ]),
      ),
    );
  }

  Padding promoCodeWidget() {
    return Padding(
      padding: const EdgeInsets.only(top: 16),
      child: TextField(
        controller: txtPromoCode,
        decoration: InputDecoration(
            filled: true,
            //<-- SEE HERE
            fillColor: Colors.white,
            hintText: "Promo Code",
            hintStyle:
                const TextStyle(fontWeight: FontWeight.w500, fontSize: 16),
            enabledBorder: OutlineInputBorder(
              borderRadius: BorderRadius.circular(16),
              borderSide: BorderSide(
                  width: 1,
                  color:
                      const Color(0xff000000).withOpacity(0.5)), //<-- SEE HERE
            ),
            focusedBorder: OutlineInputBorder(
              borderRadius: BorderRadius.circular(16),
              borderSide: BorderSide(
                  width: 1,
                  color:
                      const Color(0xff000000).withOpacity(0.5)), //<-- SEE HERE
            ),
            suffixIcon: InkWell(
              onTap: () {
                goPromoCode();
              },
              child: Container(
                width: 50,
                decoration: BoxDecoration(
                    color: TColor.primary,
                    borderRadius: BorderRadius.circular(8)),
                height: 50,
                margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 9),
                child: Center(
                  child: Text(
                    (isApplyCode ? "Remove" : "Apply").tr(),
                    style: const TextStyle(
                        color: Colors.white,
                        fontSize: 16,
                        fontWeight: FontWeight.w500),
                  ),
                ),
              ),
            )),
      ),
    );
  }

  void goPromoCode() {
    if (isApplyCode) {
      txtPromoCode.text = "";
      isApplyCode = false;
      setState(() {});
      return;
    }

    if (!isApplyCode && txtPromoCode.text.isEmpty) {
      mdShowAlert(MDGlobs.appName, MSG.enterPromocode, () {});
      return;
    }

    serviceCallPromoCode({
      "service_id": "${widget.sObj[KKey.id] ?? ""}",
      "promo_code": txtPromoCode.text
    });
  }

  void goSubmitPoint(double amount) async {
    if (selectPeriod == null) {
      mdShowAlert(MDGlobs.appName, MSG.selectPeriod, () {});
      return;
    }

    if (selectPeriod != periodArr.first && selectWeek == null) {
      mdShowAlert(MDGlobs.appName, MSG.selectWeek, () {});
      return;
    }

    await Navigator.of(context).push(PopupLayout(
        child: UsePointView(
      obj: {KKey.totalPoint: widget.bObj[KKey.totalPoint], KKey.amount: amount},
      didUse: () {
        goSubmit("point");
      },
    )));
  }

  void goSubmit(String paymentType) {
    if (selectPeriod == null) {
      mdShowAlert(MDGlobs.appName, MSG.selectPeriod, () {});
      return;
    }

    if (selectPeriod != periodArr.first && selectWeek == null) {
      mdShowAlert(MDGlobs.appName, MSG.selectWeek, () {});
      return;
    }
    //TODO:payment
    if (paymentType == "cash") {
      serviceCallList({
        "period": "${selectPeriod?["value"] ?? ""}",
        "session": "${selectWeek?["value"] ?? ""}",
        "payment_type": paymentType,
        "promo_code": txtPromoCode.text,
        "service_id": "${widget.sObj[KKey.id] ?? ""} "
      }, paymentType);
    } else {}

    var week = "${selectWeek?["value"] ?? ""}";

    serviceCallList({
      "period": "${selectPeriod?["value"] ?? ""}",
      "session": week,
      "payment_type": paymentType,
      "promo_code": txtPromoCode.text,
      "service_id": "${widget.sObj[KKey.id] ?? ""}",
      "price_key":
          "${selectPeriod?["value_key"] ?? ""}${selectWeek?["value_key"] ?? ""}",
      "point_key":
          "${selectPeriod?["value_key"] ?? ""}${selectWeek?["point_key"] ?? ""}",
      "session_key": week == "Unlimited"
          ? "${selectPeriod?["value_key"] ?? ""}${selectWeek?["session_key"] ?? ""}"
          : "",
      //session_key
    }, paymentType);
  }

  void goOnlinePayment() {
    // Navigator.of(context).push(
    //     MaterialPageRoute(builder: (context) => const OnlinePaymentView()));
  }

  void goUserPoint() async {
    // Navigator.of(context)
    //     .push(MaterialPageRoute(builder: (context) => const OurServiceView()));
  }

  //var billingDetails = BillingDetails("John Smith", "email@domain.com",
  // "+97311111111", "st. 12", "eg", "dubai", "dubai", "12345");

  PaymentSdkConfigurationDetails generateConfig(Map pObj) {
    var billingDetails = kDebugMode
        ? BillingDetails(
            "${MDServiceCall.userObj[KKey.name] ?? ""}",
            "${MDServiceCall.userObj[KKey.email] ?? ""}",
            "${MDServiceCall.userObj[KKey.mobileCode] as String? ?? "+91"}${MDServiceCall.userObj[KKey.mobile] as String? ?? ""}",
            "st. 12",
            "eg",
            "dubai",
            "dubai",
            "12345")
        : BillingDetails(
            "${MDServiceCall.userObj[KKey.name] ?? ""}",
            "${MDServiceCall.userObj[KKey.email] ?? ""}",
            "${MDServiceCall.userObj[KKey.mobileCode] as String? ?? "+91"}${MDServiceCall.userObj[KKey.mobile] as String? ?? ""}",
            "",
            "",
            "",
            "",
            "");

    List<PaymentSdkAPms> apms = [];
    apms.add(PaymentSdkAPms.AMAN);
    var configuration = PaymentSdkConfigurationDetails(
        profileId: "${pObj[KKey.profileId] ?? ""}",
        serverKey: "${pObj[KKey.serverKey] ?? ""}",
        clientKey: "${pObj[KKey.clientKey] ?? ""}",
        cartId: "${pObj[KKey.id] ?? ""}",
        cartDescription: "${pObj[KKey.cartDescription] ?? ""}",
        merchantName: "${pObj[KKey.merchantName] ?? ""}",
        screentTitle: "Pay with Card".tr(),
        amount: double.parse(
          "${pObj[KKey.amount] ?? ""}",
        ),
        showBillingInfo: true,
        forceShippingInfo: false,
        currencyCode: "${pObj[KKey.currencyCode] ?? ""}",
        merchantCountryCode: "${pObj[KKey.merchantCountryCode] ?? ""}",
        merchantApplePayIndentifier: "merchant.footfit.com",
        billingDetails: billingDetails,
        alternativePaymentMethods: apms,
        linkBillingNameWithCardHolderName: true);

    var theme = IOSThemeConfigurations();

    theme.logoImage = "assets/app_icon.png";
    theme.secondaryColor = "#333333";
    theme.titleFontColor = "#ECC800";
    theme.secondaryFontColor = "#333333";
    theme.inputsCornerRadius = 15;
    theme.buttonColor = "#ECC800";
    theme.buttonFontColor = "#333333";

    configuration.iOSThemeConfigurations = theme;
    configuration.tokeniseType = PaymentSdkTokeniseType.MERCHANT_MANDATORY;
    return configuration;
  }

  void paymobPressd(Map pObj) async {
    try {
      PaymentResult? result =
          await _paymobFlutterLibPlugin.startPayActivityNoToken(Payment(
        paymentKey: pObj[KKey.paymentKey] as String? ?? "",
        saveCardDefault: false,
        showSaveCard: false,
        themeColor: const Color(0xFF002B36),
        language: "en",
        actionbar: true,
      ));
      if (!mounted) return;

      print("transID : ${result?.id}");
      print(result);

      serviceCallCheckoutPaymentCheck({
        "subscription_id": "${pObj[KKey.id] ?? ""}",
        "transaction_id": result?.id ?? "",
        "type": "paymob",
        "data": jsonEncode(result?.payload ?? {})
      });

      // setState(() {
      //   _result = result?.dataMessage;
      //   _token = result?.token;
      //   _maskedPan = result?.maskedPan;
      // });
    } on PlatformException catch (err) {
      // Handle err

      mdShowAlert(MDGlobs.appName, MSG.fail, () {});
      print("PlatformException 1");
      print(err);
      setState(() {
        // _error = '${err.message}';
      });
    } catch (e) {
      print(e);
      if (!mounted) return;
      mdShowAlert(MDGlobs.appName, MSG.fail, () {});
      // setState(() {
      //   _error = '$e';
      // });
    }
  }

  void payOnlinePressed(Map pObj) {
    FlutterPaytabsBridge.startCardPayment(generateConfig(pObj), (event) {
      setState(() {
        if (event["status"] == "success") {
          // Handle transaction details here.
          var transactionDetails = event["data"];
          print(transactionDetails);
          if (transactionDetails["isSuccess"]) {
            print("successful transaction");
            if (transactionDetails["isPending"]) {
              print("transaction pending");
            }

            serviceCallCheckoutPaymentCheck({
              "subscription_id": "${pObj[KKey.id] ?? ""}",
              "transaction_id":
                  transactionDetails["transactionReference"] as String? ?? "",
              "data": jsonEncode(transactionDetails)
            });
          } else {
            mdShowAlert(MDGlobs.appName, MSG.fail, () {});
            print("failed transaction");
          }

          // print(transactionDetails["isSuccess"]);
        } else if (event["status"] == "error") {
          mdShowAlert(MDGlobs.appName, MSG.fail, () {});
          // Handle error here.
        } else if (event["status"] == "event") {
          mdShowAlert(MDGlobs.appName, MSG.fail, () {});
          // Handle events here.
        }
      });
    });
  }

  //MARK: ServiceCall
  void serviceCallList(Map<String, String> parameter, String paymentType) {
    MDGlobs.showHUD();

    MDServiceCall.serviceCallImageDicPost(parameter, SVKey.svCheckout,
        isToken: true, withSuccess: (responseObj) async {
      MDGlobs.hideHUD();

      debugPrint(responseObj.toString());
      if ((responseObj[KKey.status] as bool? ?? false)) {
        if (paymentType == "cash") {
          Navigator.of(context).push(
              MaterialPageRoute(builder: (context) => const OrderSubmitView()));
        } else if (paymentType == "online") {
          var payloadObj = responseObj[KKey.payload] as Map? ?? {};
          if ((payloadObj[KKey.paymentOnlineType] as String? ?? "") ==
              "paymob") {
            paymobPressd(payloadObj);
          } else if ((payloadObj[KKey.paymentOnlineType] as String? ?? "") ==
              "paytab") {
            payOnlinePressed(payloadObj);
          }

          // Navigator.of(context).push(MaterialPageRoute(
          //     builder: (context) => const OnlinePaymentView()));
        } else {
          Navigator.of(context).push(
              MaterialPageRoute(builder: (context) => const OrderSubmitView()));
        }
        if (mounted) {
          setState(() {});
        }
      } else {
        mdShowAlert(MDGlobs.appName,
            responseObj[KKey.message] as String? ?? MSG.fail, () {});
      }

      // print(responseObj);
    }, failure: (err) async {
      MDGlobs.hideHUD();

      mdShowAlert(MDGlobs.appName, err.toString(), () {});
      // print(err);
    });
  }

  void serviceCallCheckoutPaymentCheck(Map<String, String> parameter) {
    MDGlobs.showHUD();

    MDServiceCall.serviceCallImageDicPost(
        parameter, SVKey.svCheckoutPaymentCheck, isToken: true,
        withSuccess: (responseObj) async {
      MDGlobs.hideHUD();

      debugPrint(responseObj.toString());
      if ((responseObj[KKey.status] as bool? ?? false)) {
        Navigator.of(context).push(
            MaterialPageRoute(builder: (context) => const OrderSubmitView()));
      } else {
        mdShowAlert(MDGlobs.appName,
            responseObj[KKey.message] as String? ?? MSG.fail, () {});
      }

      // print(responseObj);
    }, failure: (err) async {
      MDGlobs.hideHUD();

      mdShowAlert(MDGlobs.appName, err.toString(), () {});
      // print(err);
    });
  }

  void serviceCallPromoCode(Map<String, String> parameter) {
    MDGlobs.showHUD();

    MDServiceCall.serviceCallImageDicPost(parameter, SVKey.svGetPromocode,
        isToken: true, withSuccess: (responseObj) async {
      MDGlobs.hideHUD();

      debugPrint(responseObj.toString());
      if ((responseObj[KKey.status] as bool? ?? false)) {
        promoDic = responseObj[KKey.payload] as Map? ?? {};
        isApplyCode = true;

        if (mounted) {
          setState(() {});
        }
      } else {
        isApplyCode = false;
        if (mounted) {
          setState(() {});
        }
        mdShowAlert(MDGlobs.appName,
            responseObj[KKey.message] as String? ?? MSG.fail, () {});
      }

      // print(responseObj);
    }, failure: (err) async {
      MDGlobs.hideHUD();

      mdShowAlert(MDGlobs.appName, err.toString(), () {});
      // print(err);
    });
  }
}