/*
 * The MIT License (MIT)
 * 
 * Copyright (c) 2019 Alibaba Group
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
import 'package:flutter/widgets.dart';
import 'package:flutter/material.dart';

typedef Widget PageBuilder(String pageName, Map params, String uniqueId);

class BoostPageRoute<T> extends MaterialPageRoute<T> {
  final String pageName;
  final String uniqueId;
  final Map params;
  final bool animated;
  final WidgetBuilder builder;
  final RouteSettings settings;

  final Set<VoidCallback> backPressedListeners = Set<VoidCallback>();

  @override
  Widget buildTransitions(BuildContext context, Animation<double> animation,
      Animation<double> secondaryAnimation, Widget child) {
    return child;
  }

  BoostPageRoute(
      {Key stubKey,
      this.pageName,
      this.params,
      this.uniqueId,
      this.animated,
      this.builder,
      this.settings})
      : super(
            builder: (BuildContext context) => Stub(stubKey, builder(context)),
            settings: settings);

  static BoostPageRoute<T> of<T>(BuildContext context) {
    final Route<T> route = ModalRoute.of(context);
    if (route != null && route is BoostPageRoute<T>) {
      return route;
    } else {
      throw Exception('not in a BoostPageRoute');
    }
  }

  static BoostPageRoute<T> tryOf<T>(BuildContext context) {
    final Route<T> route = ModalRoute.of(context);
    if (route != null && route is BoostPageRoute<T>) {
      return route;
    } else {
      return null;
    }
  }
}

@immutable
class Stub extends StatefulWidget {
  final Widget child;

  const Stub(Key key, this.child) : super(key: key);

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

class _StubState extends State<Stub> {
  @override
  Widget build(BuildContext context) => widget.child;
}