// 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;

const String assetChannel = 'flutter/assets';

class Engine extends RuntimeDelegate {
  final Animator _animator;
  final dynamic _runtimeController;
  final AssetManager _assetManager;
  final dynamic _delegate;

  Engine(this._animator, this._runtimeController, this._assetManager,
      this._delegate);

  @override
  String get defaultRouteName => _initialRoute ?? '/';

  String _initialRoute;

  bool get haveSurface => true;

  ViewportMetrics _viewportMetrics;
  set viewportMetrics(ViewportMetrics metrics) {
    final bool dimensionsChanged =
        _viewportMetrics.physicalHeight != metrics.physicalHeight ||
            _viewportMetrics.physicalWidth != metrics.physicalWidth;
    _viewportMetrics = metrics;
    _runtimeController.viewportMetrics = _viewportMetrics;
    if (_animator != null) {
      if (dimensionsChanged) {
        _animator.setDimensionChangePending();
      }
      if (haveSurface) {
        scheduleFrame();
      }
    }
  }

  @override
  void scheduleFrame({bool regenerateLayerTree = true}) {
    _animator.requestFrame(regenerateLayerTree);
  }

  @override
  void render(LayerTree layerTree) {
    if (layerTree == null) {
      return;
    }

    final ui.Size frameSize = ui.Size(
        _viewportMetrics.physicalWidth, _viewportMetrics.physicalHeight);

    if (frameSize.isEmpty) {
      return;
    }

    layerTree.frameSize = frameSize;
    layerTree.devicePixelRatio = _viewportMetrics.devicePixelRatio;
    _animator.render(layerTree);
  }

  @override
  void handlePlatformMessage(PlatformMessage message) {
    if (message.channel == assetChannel) {
      handleAssetPlatformMessage(message);
    } else {
      _delegate.onEngineHandlePlatformMessage(message);
    }
  }

  void handleAssetPlatformMessage(PlatformMessage message) {
    final PlatformMessageResponse response = message.response;
    if (response == null) {
      return;
    }

    final String asset = utf8.decode(message.data.buffer.asUint8List());
    if (_assetManager != null) {
      _assetManager.load(asset).then((ByteData data) {
        if (data != null) {
          response.complete(data.buffer.asUint8List());
        } else {
          response.completeEmpty();
        }
      });
    } else {
      response.completeEmpty();
    }
  }

  @override
  FontCollection getFontCollection() => null;
}

class Animator {
  void setDimensionChangePending() {}
  void render(LayerTree layerTree) {}
  void requestFrame(bool regenerateLayerTree) {}
}
