import 'package:flutter/material.dart';
import 'package:rasadyar_chicken/presentation/widget/app_bar.dart';
import 'package:rasadyar_chicken/presentation/widget/base_page/logic.dart';
import 'package:rasadyar_chicken/presentation/widget/page_route.dart';
import 'package:rasadyar_chicken/presentation/widget/search/logic.dart';
import 'package:rasadyar_chicken/presentation/widget/search/view.dart';
import 'package:rasadyar_core/core.dart';

class BasePage extends StatefulWidget {
  const BasePage({
    super.key,
    this.routes,
    this.widgets,
    this.routesWidget,
    this.floatingActionButtonLocation,
    this.floatingActionButton,
    this.onSearchChanged,
    this.child,
    this.hasBack = true,
    this.hasFilter = true,
    this.hasSearch = true,
    this.isBase = false,
    this.onBackPressed,
    this.onFilterTap,
    this.onSearchTap,
    this.filteringWidget,
  }) : assert(
         (routes != null) || routesWidget != null,
         'Either routes or routesWidget must be provided.',
       );

  final List<String>? routes;
  final Widget? routesWidget;
  final List<Widget>? widgets;
  final Widget? child;
  final FloatingActionButtonLocation? floatingActionButtonLocation;
  final Widget? floatingActionButton;
  final Widget? filteringWidget;
  final void Function(String?)? onSearchChanged;
  final bool hasBack;
  final bool hasFilter;
  final bool hasSearch;
  final bool isBase;
  final VoidCallback? onBackPressed;
  final GestureTapCallback? onFilterTap;
  final GestureTapCallback? onSearchTap;

  @override
  State<BasePage> createState() => _BasePageState();
}

class _BasePageState extends State<BasePage> {
  BaseLogic get controller => Get.find<BaseLogic>();
  Worker? filterWorker;
  bool _isBottomSheetOpen = false;

  @override
  void initState() {
    super.initState();
    /*  filterWorker = ever(controller.isFilterSelected, (bool isSelected) {
      if (!mounted) return;

      if (isSelected && widget.filteringWidget != null) {
        // بررسی اینکه آیا bottomSheet از قبل باز است یا نه
        if (_isBottomSheetOpen) {
          controller.isFilterSelected.value = false;
          return;
        }

        // بررسی اینکه آیا route فعلی current است یا نه
        if (ModalRoute.of(context)?.isCurrent != true) {
          controller.isFilterSelected.value = false;
          return;
        }

        _isBottomSheetOpen = true;
        Get.bottomSheet(
          widget.filteringWidget!,
          isScrollControlled: true,
          isDismissible: true,
          enableDrag: true,
        ).then((_) {
          // تنظیم مقدار به false بعد از بسته شدن bottomSheet
          if (mounted) {
            _isBottomSheetOpen = false;
            controller.isFilterSelected.value = false;
          }
        });
      }
    });*/
  }

  @override
  void dispose() {
    filterWorker?.dispose();
    super.dispose();
  }

  void _onFilterTap() {
    if (widget.hasFilter && widget.filteringWidget != null) {
      // بررسی اینکه آیا این route در top است یا نه
      final currentRoute = ModalRoute.of(context);
      if (currentRoute?.isCurrent != true) {
        return;
      }

      // مستقیماً bottomSheet را باز کنید
      Get.bottomSheet(
        widget.filteringWidget!,
        isScrollControlled: true,
        isDismissible: true,
        enableDrag: true,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (didPop, result) => widget.onBackPressed,
      child: Scaffold(
        backgroundColor: AppColor.bgLight,
        appBar: chickenAppBar(
          hasBack: widget.isBase ? false : widget.hasBack,
          onBackPressed: widget.onBackPressed,
          hasFilter: widget.hasFilter,
          hasSearch: widget.hasSearch,
          isBase: widget.isBase,
          onFilterTap: widget.hasFilter ? _onFilterTap : null,
          onSearchTap: widget.hasSearch ? () => Get.find<SearchLogic>().toggleSearch() : null,
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!),
            if (!widget.isBase && widget.hasSearch) ...{
              SearchWidget(onSearchChanged: widget.onSearchChanged),
            },

            if (widget.child != null) ...{Expanded(child: widget.child!)},
            ...?widget.widgets,
          ],
        ),
        floatingActionButtonLocation: widget.floatingActionButtonLocation,
        floatingActionButton: widget.floatingActionButton,
      ),
    );
  }
}

class BasePageWithScroll extends StatefulWidget {
  const BasePageWithScroll({
    super.key,
    this.routes,
    required this.widgets,
    this.routesWidget,
    this.floatingActionButtonLocation,
    this.floatingActionButton,
    this.onSearchChanged,
    this.hasBack = true,
    this.hasFilter = true,
    this.hasSearch = true,
    this.isBase = false,
    this.onBackPressed,
    this.onFilterTap,
    this.onSearchTap,
    this.filteringWidget,
  }) : assert(
         (routes != null) || routesWidget != null,
         'Either routes or routesWidget must be provided.',
       );

  final List<String>? routes;
  final Widget? routesWidget;
  final List<Widget> widgets;
  final FloatingActionButtonLocation? floatingActionButtonLocation;
  final Widget? floatingActionButton;
  final Widget? filteringWidget;
  final void Function(String?)? onSearchChanged;
  final bool hasBack;
  final bool hasFilter;
  final bool hasSearch;
  final bool isBase;
  final VoidCallback? onBackPressed;
  final GestureTapCallback? onFilterTap;
  final GestureTapCallback? onSearchTap;

  @override
  State<BasePageWithScroll> createState() => _BasePageWithScrollState();
}

class _BasePageWithScrollState extends State<BasePageWithScroll> {
  BaseLogic get controller => Get.find<BaseLogic>();
  Worker? filterWorker;

  @override
  void dispose() {
    filterWorker?.dispose();
    super.dispose();
  }

  void _onFilterTap() {
    if (widget.hasFilter && widget.filteringWidget != null) {
      // بررسی اینکه آیا این route در top است یا نه
      final currentRoute = ModalRoute.of(context);
      if (currentRoute?.isCurrent != true) {
        return;
      }

      // مستقیماً bottomSheet را باز کنید
      Get.bottomSheet(
        widget.filteringWidget!,
        isScrollControlled: true,
        isDismissible: true,
        enableDrag: true,
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false,
      onPopInvokedWithResult: (didPop, result) => widget.onBackPressed,
      child: Scaffold(
        backgroundColor: AppColor.bgLight,
        appBar: chickenAppBar(
          hasBack: widget.isBase ? false : widget.hasBack,
          onBackPressed: widget.onBackPressed,
          hasFilter: widget.hasFilter,
          hasSearch: widget.hasSearch,
          isBase: widget.isBase,
          onFilterTap: widget.hasFilter ? _onFilterTap : null,
          onSearchTap: widget.hasSearch ? () => Get.find<SearchLogic>().toggleSearch() : null,
        ),
        body: SingleChildScrollView(
          physics: BouncingScrollPhysics(),
          padding: EdgeInsets.symmetric(vertical: 8.h),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              widget.routesWidget != null ? widget.routesWidget! : buildPageRoute(widget.routes!),
              if (!widget.isBase && widget.hasSearch) ...{
                SearchWidget(onSearchChanged: widget.onSearchChanged),
              },
              ...widget.widgets,
            ],
          ),
        ),
        floatingActionButtonLocation: widget.floatingActionButtonLocation,
        floatingActionButton: widget.floatingActionButton,
      ),
    );
  }
}
