import 'package:barcode/barcode.dart';
import 'package:flutter/material.dart';

/// Renders [data] as a QR code, painted from the pure-Dart `barcode` matrix (no
/// native plugin). Used for the profile's shareable identity — hand your npub to
/// someone at a fair with a scan.
class QrView extends StatelessWidget {
  const QrView({required this.data, this.size = 200, super.key});

  final String data;
  final double size;

  @override
  Widget build(BuildContext context) {
    return Container(
      width: size,
      height: size,
      color: Colors.white,
      padding: const EdgeInsets.all(8),
      child: CustomPaint(
        size: Size.square(size),
        painter: _QrPainter(data),
      ),
    );
  }
}

class _QrPainter extends CustomPainter {
  _QrPainter(this.data);

  final String data;

  @override
  void paint(Canvas canvas, Size size) {
    final black = Paint()..color = Colors.black;
    for (final element in Barcode.qrCode()
        .make(data, width: size.width, height: size.height)) {
      if (element is BarcodeBar && element.black) {
        canvas.drawRect(
          Rect.fromLTWH(
            element.left,
            element.top,
            element.width,
            element.height,
          ),
          black,
        );
      }
    }
  }

  @override
  bool shouldRepaint(_QrPainter oldDelegate) => oldDelegate.data != data;
}
