// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. 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:pageloader/html.dart';

import 'results_panel_po.dart';

part 'try_results_po.g.dart';

@PageObject()
abstract class TryResultsPO {
  TryResultsPO();
  factory TryResultsPO.create(PageLoaderElement context) = $TryResultsPO.create;

  @First(ByTagName('results-panel'))
  PageLoaderElement get _resultsPanel;

  @First(ByTagName('results-selector-panel'))
  PageLoaderElement get _resultsSelectorPanel;

  ResultsPanelPO get resultsPanel => _resultsPanel.exists
      ? ResultsPanelPO.create(_resultsPanel)
      : ResultsSelectorPanelPO.create(_resultsSelectorPanel);

  @ByTagName('material-button')
  List<PageLoaderElement> get _buttons;

  @First(ByCss('material-input textarea'))
  PageLoaderElement get _commentField;

  PageLoaderElement get commentField => _commentField;

  @ByCss('try-results  div  div.comment')
  List<PageLoaderElement> get _comments;

  List<PageLoaderElement> get comments => _comments;

  PageLoaderElement _buttonCalled(String text) =>
      _buttons.firstWhere((final button) => button.innerText == text,
          orElse: () => null);

  PageLoaderElement get approveCommentButton =>
      _buttonCalled("Approve/Comment ...");
  PageLoaderElement get cancelButton => _buttonCalled("Cancel");
  PageLoaderElement get revokeButton =>
      _buttonCalled("Revoke Selected Approvals");
  PageLoaderElement get commentOnlyButton =>
      _buttonCalled("Comment without Approving");
  PageLoaderElement get approveButton => _buttonCalled("Approve");

  void clickApproveComment() {
    approveCommentButton.click();
    for (final button in _buttons) {
      print(button.innerText);
    }
  }
}
