import 'package:flutter/cupertino.dart' as cupertino;
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:mobile_nebula/services/utils.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';

enum SimpleScrollable {
  none,
  vertical,
  horizontal,
  both,
}

class SimplePage extends StatelessWidget {
  const SimplePage(
      {Key key,
      this.title,
      @required this.child,
      this.leadingAction,
      this.trailingActions = const [],
      this.scrollable = SimpleScrollable.vertical,
      this.scrollbar = true,
      this.scrollController,
      this.bottomBar,
      this.onRefresh,
      this.onLoading,
      this.refreshController})
      : super(key: key);

  final String title;
  final Widget child;
  final SimpleScrollable scrollable;
  final ScrollController scrollController;

  /// Set this to true to force draw a scrollbar without a scroll view, this is helpful for pages with Reorderable listviews
  /// This is set to true if you have any scrollable other than none
  final bool scrollbar;
  final Widget bottomBar;

  /// If no leading action is provided then a default "Back" widget than pops the page will be provided
  final Widget leadingAction;
  final List<Widget> trailingActions;

  final VoidCallback onRefresh;
  final VoidCallback onLoading;
  final RefreshController refreshController;


  @override
  Widget build(BuildContext context) {
    Widget realChild = child;
    var addScrollbar = this.scrollbar;

    if (scrollable == SimpleScrollable.vertical || scrollable == SimpleScrollable.both) {
      realChild = SingleChildScrollView(scrollDirection: Axis.vertical, child: realChild, controller: refreshController == null ? scrollController : null);
      addScrollbar = true;
    }

    if (scrollable == SimpleScrollable.horizontal || scrollable == SimpleScrollable.both) {
      realChild = SingleChildScrollView(scrollDirection: Axis.horizontal, child: realChild);
      addScrollbar = true;
    }

    if (refreshController != null) {
      realChild = RefreshConfiguration(
          headerTriggerDistance: 100,
          footerTriggerDistance: -100,
          maxUnderScrollExtent: 100,
          child: SmartRefresher(
              scrollController: scrollController,
              onRefresh: onRefresh,
              onLoading: onLoading,
              controller: refreshController,
              child: realChild,
              enablePullUp: onLoading != null,
              enablePullDown: onRefresh != null,
              footer: ClassicFooter(loadStyle: LoadStyle.ShowWhenLoading),
              ));
      addScrollbar = true;
    }

    if (addScrollbar) {
      realChild = Scrollbar(child: realChild);
    }

    if (bottomBar != null) {
      realChild = Column(children: [
        Expanded(child: realChild),
        bottomBar,
      ]);
    }

    return PlatformScaffold(
        backgroundColor: cupertino.CupertinoColors.systemGroupedBackground.resolveFrom(context),
        appBar: PlatformAppBar(
          title: Text(title),
          leading: leadingAction != null ? leadingAction : Utils.leadingBackWidget(context),
          trailingActions: trailingActions,
          ios: (_) => CupertinoNavigationBarData(
            transitionBetweenRoutes: false,
          ),
        ),
        body: SafeArea(child: realChild));
  }
}