import 'dart:math' as math;
import 'dart:ui';

/// Circular capture guide (coin frame).
class GuideFrame {
  static const double maxDiameterFraction = 0.72;
  static const double centerYFraction = 0.46;

  static Rect inViewport(Size size) {
    final d = math.min(size.width, size.height) * maxDiameterFraction;
    return Rect.fromCenter(
      center: Offset(size.width / 2, size.height * centerYFraction),
      width: d,
      height: d,
    );
  }

  static Rect inCoverImage({
    required Size viewport,
    required Size imageSize,
  }) {
    final guide = inViewport(viewport);
    final scale = math.max(
      viewport.width / imageSize.width,
      viewport.height / imageSize.height,
    );
    final dispW = imageSize.width * scale;
    final dispH = imageSize.height * scale;
    final ox = (viewport.width - dispW) / 2;
    final oy = (viewport.height - dispH) / 2;

    final mapped = Rect.fromLTRB(
      (guide.left - ox) / scale,
      (guide.top - oy) / scale,
      (guide.right - ox) / scale,
      (guide.bottom - oy) / scale,
    );
    return mapped.intersect(
      Rect.fromLTWH(0, 0, imageSize.width, imageSize.height),
    );
  }

  static Rect inImage(Size imageSize) => inViewport(imageSize);
}
