// ignore_for_file: sized_box_for_whitespace

import 'package:flutter/material.dart';
import 'package:tour_travel_agr/api/all_api.dart';
import 'package:tour_travel_agr/helper/components_widget/custom_appbar.dart';
import 'package:tour_travel_agr/helper/components_widget/modal_select_date.dart';
import 'package:tour_travel_agr/helper/components_widget/transaction_list.dart';
import 'package:tour_travel_agr/helper/function/number.dart';
import 'package:tour_travel_agr/helper/function/replace_date.dart';
import 'package:tour_travel_agr/helper/function/session_check.dart';
import 'package:tour_travel_agr/helper/modal_dialog.dart';
import 'package:tour_travel_agr/helper/prefs.dart';
import 'package:tour_travel_agr/helper/widget_responsive.dart';
import 'package:tour_travel_agr/models/reimburse_model.dart';
import 'package:tour_travel_agr/resource/assets.dart';
import 'package:tour_travel_agr/resource/colors.dart';
import 'package:tour_travel_agr/resource/constanta_string.dart';
import 'package:tour_travel_agr/resource/font.dart';
import 'package:tour_travel_agr/resource/routes.dart';
import 'package:tour_travel_agr/resource/size.dart';
import 'package:tour_travel_agr/resource/strings.dart';
import 'package:tour_travel_agr/resource/style.dart';

class ReimbursementView extends StatelessWidget {
  const ReimbursementView({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: ColorManager.backgroundColor,
      body: ScreenResponsive(
        widget: const BodyWidget(),
        widthScreen: MediaQuery.of(context).size.width,
      ),
    );
  }
}

class BodyWidget extends StatefulWidget {
  const BodyWidget({
    super.key,
  });

  @override
  State<BodyWidget> createState() => _BodyWidgetState();
}

class _BodyWidgetState extends State<BodyWidget> {
  String dateSelected = dateLocal(DateTime.now().toLocal().toString());

  bool? todayActive;
  bool? customDateActive;
  String? startDate;
  String? endDate;
  List<ReimburseModel>? dataReimburse;
  bool responseApiError = false;

  @override
  void initState() {
    checkSession().then((isLogin) {
      if (isLogin) {
        resetFilter().then((_) {
          getReimburseData(startDate, endDate);
        });
      } else {
        Navigator.pushNamedAndRemoveUntil(
          context,
          Routes.loginRoute,
          (route) => false,
        );
      }
    });

    super.initState();
  }

  @override
  void dispose() {
    setReimburseDate("");
    super.dispose();
  }

  void getReimburseData(String? start, String? end) {
    Api.reimburse(start, end).then((apiResponse) {
      if (apiResponse.error) {
        if (apiResponse.data["code"] == "WRONG_SESSION_ID") {
          modalDialogGlobal(
            context: context,
            title: "Session Expired",
            contentBody: Strings.sessionExpired,
            buttonText: "OK",
            tapButton: () {
              removeSessionId();
              Navigator.pushNamedAndRemoveUntil(
                context,
                Routes.loginRoute,
                (route) => false,
              );
            },
          );
        } else {
          modalDialogGlobal(
            context: context,
            title: "Error",
            contentBody: apiResponse.msg,
            buttonText: "OK",
            tapButton: () {
              Navigator.pop(context);
              Navigator.pop(context);
            },
          );
        }
      } else {
        setState(() {
          dataReimburse = apiResponse.data as List<ReimburseModel>;
        });
      }
    });
  }

  Future<void> resetFilter() async {
    String reimburseDate = getReimburseDate();
    if (reimburseDate != '') {
      List<String> split = reimburseDate.split(" - ");
      if (split.length > 1) {
        startDate = split[0];
        endDate = split[1];
        customDateActive = true;
        todayActive = false;
      } else {
        customDateActive = false;
        todayActive = true;
        startDate = split[0];
        endDate = split[0];
      }
    } else {
      startDate = dateLocal(DateTime.now().toLocal().toString());
      endDate = dateLocal(DateTime.now().toLocal().toString());
      customDateActive = false;
      todayActive = true;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(
        top: AppPadding.safeAreaTop(context),
        left: AppPadding.p20,
        right: AppPadding.p20,
        bottom: AppPadding.safeAreaBot(context),
      ),
      child: Column(
        children: [
          const CustomAppBar(text: "Reimbursement"),
          Container(
            decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(
                5,
              ),
              border: Border.all(
                color: ColorManager.grey.withOpacity(
                  0.25,
                ),
              ),
            ),
            margin: EdgeInsets.only(
              top: AppMargin.m16,
            ),
            padding: EdgeInsets.symmetric(
              horizontal: AppPadding.p20,
              vertical: AppPadding.p9,
            ),
            child: Center(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(
                    dateSelected,
                    style: getSemiBoldStyle(
                      color: Colors.black,
                      fontFamily: FontConstants.openSans,
                    ),
                  ),
                  GestureDetector(
                    onTap: () {
                      showModalBottomSheet(
                          backgroundColor: ColorManager.backgroundColor,
                          isScrollControlled: true,
                          context: context,
                          builder: (context) {
                            return ModalSelectDate(
                              onTapWidget: () {
                                setState(() {
                                  dateSelected = getReimburseDate();
                                  dataReimburse = null;
                                });
                                Navigator.pop(context);
                                resetFilter().then((_) {
                                  getReimburseData(startDate, endDate);
                                });
                              },
                              todayActive: todayActive!,
                              customDateActive: customDateActive!,
                              startDate: startDate,
                              endDate: endDate,
                              fromWidget: ConstantString.fromWidgetReimburse,
                            );
                          });
                    },
                    child: Image(
                      image: AssetImage(
                        Assets.calenderIcon,
                      ),
                    ),
                  )
                ],
              ),
            ),
          ),
          const SizedBox(
            height: 12,
          ),
          Expanded(
            child: (dataReimburse == null)
                ? ListView.builder(
                    padding: EdgeInsets.zero,
                    itemCount: 5,
                    itemBuilder: (c, index) {
                      return const ListTransaction(
                        date: null,
                        title: null,
                        subtitle: null,
                      );
                    },
                  )
                : (dataReimburse!.isEmpty)
                    ? Container(
                        width: double.infinity,
                        height: double.infinity,
                        padding: EdgeInsets.symmetric(
                          horizontal: AppPadding.p20,
                        ),
                        child: Center(
                          child: Text(
                            Strings.reimbursementNotFound,
                            style: getSemiBoldStyle(
                              color: Colors.grey,
                              fontSize: FontSize.s20,
                            ),
                            textAlign: TextAlign.center,
                          ),
                        ),
                      )
                    : ListView.builder(
                        padding: EdgeInsets.zero,
                        itemCount: dataReimburse!.length,
                        itemBuilder: (c, index) {
                          return ListTransaction(
                            date: dateLocal(dataReimburse![index].date),
                            title:
                                "${dataReimburse![index].transactionCount} Transaksi",
                            subtitle: "Rp ${parsingAmountBackend(
                              dataReimburse![index].comissionAmount,
                            )}",
                          );
                        },
                      ),
          ),
        ],
      ),
    );
  }
}
