// 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(Float64List 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: 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, double strokeWidth,
      Color color) {
    _called('drawPoints', arguments: <String, dynamic>{
      'pointMode': pointMode,
      'points': points,
      'strokeWidth': strokeWidth,
      'color': color,
    });
  }

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