part of flutter_sprites;

class _PhysicsDebugDraw extends box2d.DebugDraw {
  _PhysicsDebugDraw(
    box2d.ViewportTransform transform,
    this.physicsWorld
  ) : super(transform) {
    appendFlags(
      box2d.DebugDraw.JOINT_BIT |
      box2d.DebugDraw.CENTER_OF_MASS_BIT |
      box2d.DebugDraw.WIREFRAME_DRAWING_BIT
    );
  }

  PhysicsWorld physicsWorld;

  Canvas canvas;

  void drawSegment(Vector2 p1, Vector2 p2, box2d.Color3i color) {
    Paint paint = new Paint()
      ..color = _toColor(color)
      ..strokeWidth = 1.0;
    canvas.drawLine(_toPoint(p1), _toPoint(p2), paint);
  }

  void drawSolidPolygon(
    List<Vector2> vertices,
    int vertexCount,
    box2d.Color3i color
  ) {
    Path path = new Path();
    Point pt = _toPoint(vertices[0]);
    path.moveTo(pt.x, pt.y);
    for (int i = 1; i < vertexCount; i++) {
      pt = _toPoint(vertices[i]);
      path.lineTo(pt.x, pt.y);
    }

    Paint paint = new Paint()..color = _toColor(color);
    canvas.drawPath(path, paint);
  }

  void drawCircle(Vector2 center, num radius, box2d.Color3i color, [Vector2 axis]) {
    Paint paint = new Paint()
      ..color = _toColor(color)
      ..style = PaintingStyle.stroke
      ..strokeWidth = 1.0;

    canvas.drawCircle(_toPoint(center), _scale(radius), paint);
  }

  void drawSolidCircle(Vector2 center, num radius, Vector2 axis, box2d.Color3i color) {
    Paint paint = new Paint()
      ..color = _toColor(color);

    canvas.drawCircle(_toPoint(center), _scale(radius), paint);
  }

  void drawPoint(Vector2 point, num radiusOnScreen, box2d.Color3i color) {
    drawSolidCircle(point, radiusOnScreen, null, color);
  }

  void drawParticles(
    List<Vector2> centers,
    double radius,
    List<box2d.ParticleColor> colors,
    int count
  ) {
    // TODO: Implement
  }

  void drawParticlesWireframe(
    List<Vector2> centers,
    double radius,
    List<box2d.ParticleColor> colors,
    int count
  ) {
    // TODO: Implement
  }

  void drawTransform(box2d.Transform xf, box2d.Color3i color) {
    drawCircle(xf.p, 0.1, color);
    // TODO: Improve
  }

  void drawStringXY(num x, num y, String s, box2d.Color3i color) {
    // TODO: Implement
  }

  Color _toColor(box2d.Color3i color) {
    return new Color.fromARGB(255, color.x, color.y, color.z);
  }

  Point _toPoint(Vector2 vec) {
    return new Point(
      vec.x * physicsWorld.b2WorldToNodeConversionFactor,
      vec.y * physicsWorld.b2WorldToNodeConversionFactor
    );
  }

  double _scale(double value) {
    return value * physicsWorld.b2WorldToNodeConversionFactor;
  }
}