// Copyright 2019 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';

/// [EdgeChildrenFocusTraversalPolicy] can be used to make sure that when you
/// are at the last or first focus node inside of a focus scope, we'll request
/// focus for given focus node outside of the scope.
///
/// This can be used to for example make sure that you can request focus outside
/// of the MaterialApp you are currently in.
class EdgeChildrenFocusTraversalPolicy extends WidgetOrderFocusTraversalPolicy {
  EdgeChildrenFocusTraversalPolicy({
    @required this.firstFocusNodeOutsideScope,
    @required this.lastFocusNodeOutsideScope,
    this.focusScope,
    this.firstFocusNodeInsideScope,
    this.lastFocusNodeInsideScope,
  }) : assert((focusScope != null &&
                firstFocusNodeInsideScope == null &&
                lastFocusNodeInsideScope == null) ||
            (firstFocusNodeInsideScope != null &&
                lastFocusNodeInsideScope != null &&
                focusScope == null));

  final FocusNode firstFocusNodeOutsideScope;
  final FocusNode lastFocusNodeOutsideScope;

  /// Either provide [focusScope] or both [firstFocusNodeInsideScope]
  /// and [lastFocusNodeInsideScope].
  final FocusScopeNode focusScope;
  final FocusNode firstFocusNodeInsideScope;
  final FocusNode lastFocusNodeInsideScope;

  @override
  bool previous(FocusNode currentNode) {
    if (currentNode ==
        (firstFocusNodeInsideScope ??
            focusScope.traversalChildren.toList().first)) {
      firstFocusNodeOutsideScope.requestFocus();
      return true;
    } else {
      return super.previous(currentNode);
    }
  }

  @override
  bool next(FocusNode currentNode) {
    if (currentNode ==
        (lastFocusNodeInsideScope ??
            focusScope.traversalChildren.toList().last)) {
      lastFocusNodeOutsideScope.requestFocus();
      return true;
    } else {
      return super.next(currentNode);
    }
  }
}
