// 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
import 'dart:html' as html;
import 'dart:typed_data';

import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart';

/// Contains method name that was called on [MockEngineCanvas] and arguments
/// that were passed.
class MockCanvasCall {
  MockCanvasCall._({
    this.methodName,
    this.arguments,
  });

  final String methodName;
  final dynamic arguments;

  @override
  String toString() {
    return '$MockCanvasCall($methodName, $arguments)';
  }
}

/// A fake implementation of [EngineCanvas] that logs calls to its methods but
/// doesn't actually paint anything.
///
/// Useful for testing interactions between upper layers of the system with
/// canvases.
class MockEngineCanvas implements EngineCanvas {
  final List<MockCanvasCall> methodCallLog = <MockCanvasCall>[];

  @override
  html.Element get rootElement => null;

  void _called(String methodName, {dynamic arguments}) {
    methodCallLog.add(MockCanvasCall._(
      methodName: methodName,
      arguments: arguments,
    ));
  }

  @override
  void dispose() {
    _called('dispose');
  }

  @override
  void clear() {
    _called('clear');
  }

  @override
  void save() {
    _called('save');
  }

  @override
  void restore() {
    _called('restore');
  }

  @override
  void translate(double dx, double dy) {
    _called('translate', arguments: <String, double>{
      'dx': dx,
      'dy': dy,
    });
  }

  @override
  void scale(double sx, double sy) {
    _called('scale', arguments: <String, double>{
      'sx': sx,
      'sy': sy,
    });
  }

  @override
  void rotate(double radians) {
    _called('rotate', arguments: radians);
  }

  @override
  void skew(double sx, double sy) {
    _called('skew', arguments: <String, double>{
      'sx': sx,
      'sy': sy,
    });
  }

  @override
  void transform(Float32List matrix4) {
    _called('transform', arguments: matrix4);
  }

  @override
  void clipRect(Rect rect) {
    _called('clipRect', arguments: rect);
  }

  @override
  void clipRRect(RRect rrect) {
    _called('clipRRect', arguments: rrect);
  }

  @override
  void clipPath(Path path) {
    _called('clipPath', arguments: path);
  }

  @override
  void drawColor(Color color, BlendMode blendMode) {
    _called('drawColor', arguments: <String, dynamic>{
      'color': color,
      'blendMode': blendMode,
    });
  }

  @override
  void drawLine(Offset p1, Offset p2, SurfacePaintData paint) {
    _called('drawLine', arguments: <String, dynamic>{
      'p1': p1,
      'p2': p2,
      'paint': paint,
    });
  }

  @override
  void drawPaint(SurfacePaintData paint) {
    _called('drawPaint', arguments: paint);
  }

  @override
  void drawRect(Rect rect, SurfacePaintData paint) {
    _called('drawRect', arguments: <String, dynamic>{
      'rect': rect,
      'paint': paint,
    });
  }

  @override
  void drawRRect(RRect rrect, SurfacePaintData paint) {
    _called('drawRRect', arguments: <String, dynamic>{
      'rrect': rrect,
      'paint': paint,
    });
  }

  @override
  void drawDRRect(RRect outer, RRect inner, SurfacePaintData paint) {
    _called('drawDRRect', arguments: <String, dynamic>{
      'outer': outer,
      'inner': inner,
      'paint': paint,
    });
  }

  @override
  void drawOval(Rect rect, SurfacePaintData paint) {
    _called('drawOval', arguments: <String, dynamic>{
      'rect': rect,
      'paint': paint,
    });
  }

  @override
  void drawCircle(Offset c, double radius, SurfacePaintData paint) {
    _called('drawCircle', arguments: <String, dynamic>{
      'c': c,
      'radius': radius,
      'paint': paint,
    });
  }

  @override
  void drawPath(Path path, SurfacePaintData paint) {
    _called('drawPath', arguments: <String, dynamic>{
      'path': path,
      'paint': paint,
    });
  }

  @override
  void drawShadow(
      Path path, Color color, double elevation, bool transparentOccluder) {
    _called('drawShadow', arguments: <String, dynamic>{
      'path': path,
      'color': color,
      'elevation': elevation,
      'transparentOccluder': transparentOccluder,
    });
  }

  @override
  void drawImage(Image image, Offset p, SurfacePaintData paint) {
    _called('drawImage', arguments: <String, dynamic>{
      'image': image,
      'p': p,
      'paint': paint,
    });
  }

  @override
  void drawImageRect(Image image, Rect src, Rect dst, SurfacePaintData paint) {
    _called('drawImageRect', arguments: <String, dynamic>{
      'image': image,
      'src': src,
      'dst': dst,
      'paint': paint,
    });
  }

  @override
  void drawParagraph(Paragraph paragraph, Offset offset) {
    _called('drawParagraph', arguments: <String, dynamic>{
      'paragraph': paragraph,
      'offset': offset,
    });
  }

  @override
  void drawVertices(
      Vertices vertices, BlendMode blendMode, SurfacePaintData paint) {
    _called('drawVertices', arguments: <String, dynamic>{
      'vertices': vertices,
      'blendMode': blendMode,
      'paint': paint,
    });
  }

  @override
  void drawPoints(PointMode pointMode, Float32List points, SurfacePaintData paint) {
    _called('drawPoints', arguments: <String, dynamic>{
      'pointMode': pointMode,
      'points': points,
      'paint': paint,
    });
  }

  @override
  void endOfPaint() {
    _called('endOfPaint', arguments: <String, dynamic>{});
  }
}
