// 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, ClipOp op) {
    _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>{});
  }
}
