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

// @dart = 2.6
part of engine;

html.HtmlElement _createContainer() {
  final html.HtmlElement container = html.DivElement();
  container.style
    ..position = 'fixed'
    ..top = '0'
    ..right = '0'
    ..padding = '6px'
    ..color = '#fff'
    ..backgroundColor = '#000'
    ..opacity = '0.8';
  return container;
}

/// An overlay in the top right corner of the page that shows statistics
/// regarding canvas reuse.
///
/// This should only be used for development purposes and never included in
/// release builds.
class DebugCanvasReuseOverlay {
  DebugCanvasReuseOverlay._() {
    final html.HtmlElement container = _createContainer();
    final html.HtmlElement title = html.DivElement();
    title.style
      ..fontWeight = 'bold'
      ..textDecoration = 'underline';
    title.text = 'Canvas Reuse';

    html.document.body.append(
      container
        ..append(title)
        ..append(
          html.DivElement()
            ..appendText('Created: ')
            ..append(_created),
        )
        ..append(
          html.DivElement()
            ..appendText('Kept: ')
            ..append(_kept),
        )
        ..append(
          html.DivElement()
            ..appendText('Reused: ')
            ..append(_reused),
        )
        ..append(
          html.DivElement()
            ..appendText('Disposed: ')
            ..append(_disposed),
        )
        ..append(
          html.DivElement()
            ..appendText('In Recycle List: ')
            ..append(_inRecycle),
        )
        ..append(
          html.DivElement()
            ..append(
              html.ButtonElement()
                ..text = 'Reset'
                ..addEventListener('click', (_) => _reset()),
            ),
        ),
    );
  }

  static DebugCanvasReuseOverlay _instance;
  static DebugCanvasReuseOverlay get instance {
    if (_instance == null) {
      // Only call the constructor when assertions are enabled to guard against
      // mistakingly including this class in a release build.
      if (assertionsEnabled) {
        _instance = DebugCanvasReuseOverlay._();
      }
    }
    return _instance;
  }

  final html.Text _created = html.Text('0');
  final html.Text _kept = html.Text('0');
  final html.Text _reused = html.Text('0');
  final html.Text _disposed = html.Text('0');
  final html.Text _inRecycle = html.Text('0');

  int _createdCount = 0;
  int get createdCount => _createdCount;
  set createdCount(int createdCount) {
    _createdCount = createdCount;
    _update();
  }

  int _keptCount = 0;
  int get keptCount => _keptCount;
  set keptCount(int keptCount) {
    _keptCount = keptCount;
    _update();
  }

  int _reusedCount = 0;
  int get reusedCount => _reusedCount;
  set reusedCount(int reusedCount) {
    _reusedCount = reusedCount;
    _update();
  }

  int _disposedCount = 0;
  int get disposedCount => _disposedCount;
  set disposedCount(int disposedCount) {
    _disposedCount = disposedCount;
    _update();
  }

  int _inRecycleCount = 0;
  int get inRecycleCount => _inRecycleCount;
  set inRecycleCount(int inRecycleCount) {
    _inRecycleCount = inRecycleCount;
    _update();
  }

  void _update() {
    _created.text = '$_createdCount';
    _kept.text = '$_keptCount';
    _reused.text = '$_reusedCount';
    _disposed.text = '$_disposedCount';
    _inRecycle.text = '$_inRecycleCount';
  }

  void _reset() {
    _createdCount =
        _keptCount = _reusedCount = _disposedCount = _inRecycleCount = 0;
    _update();
  }
}
