// lib/editor/render/live_ink_painter.dart
//
// CustomPainter for the in-progress stroke (live) layer.
//
// Paints only the single EditorStroke? currently being drawn, with
// isComplete:false so perfect_freehand tapers the trailing end correctly.
// Kept in a separate RepaintBoundary so committed strokes are never
// re-rasterized on pointer-move events.

import 'package:flutter/material.dart';

import '../engine/stroke_geometry.dart';
import '../engine/stroke_model.dart';

/// Paints the single in-progress [EditorStroke] (or nothing when [live] is
/// null / empty). Use alongside [StaticInkPainter] in stacked [CustomPaint]s.
class LiveInkPainter extends CustomPainter {
  const LiveInkPainter({
    required this.live,
    required this.pageSize,
    this.thinning = kDefaultPenThinning,
  });

  /// The stroke currently being drawn, or null when idle.
  final EditorStroke? live;
  final Size pageSize;

  /// perfect_freehand pressure→width response (from `PenConfig.pressureSensitivity`),
  /// kept consistent with the static layer so the stroke doesn't change width
  /// the instant it commits.
  final double thinning;

  @override
  void paint(Canvas canvas, Size size) {
    final stroke = live;
    if (stroke == null || stroke.points.isEmpty) return;

    final path = buildStrokeOutline(stroke, pageSize,
        isComplete: false, thinning: thinning);
    if (path.getBounds().isEmpty) return;

    canvas.drawPath(
      path,
      Paint()
        ..color = Color(stroke.color)
        ..style = PaintingStyle.fill
        ..isAntiAlias = true,
    );
  }

  @override
  bool shouldRepaint(LiveInkPainter old) =>
      !identical(old.live, live) ||
      old.pageSize != pageSize ||
      old.thinning != thinning;
}
