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

/// カメラのライブプレビューを全画面で表示するウィジェット．
///
/// フロントカメラの映像を鏡像（左右反転）で表示する．
class CameraPreviewWidget extends StatelessWidget {
  const CameraPreviewWidget({super.key, required this.controller});

  final CameraController controller;

  @override
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return const Center(child: CircularProgressIndicator());
    }

    return LayoutBuilder(
      builder: (context, constraints) {
        final previewSize = controller.value.previewSize;
        if (previewSize == null) {
          return const Center(child: CircularProgressIndicator());
        }

        // カメラのアスペクト比（プレビューは横長で返るので反転）
        final cameraAspect = previewSize.height / previewSize.width;
        final screenAspect = constraints.maxWidth / constraints.maxHeight;

        // 画面いっぱいに表示するためのスケール
        final scale = cameraAspect > screenAspect
            ? constraints.maxHeight / (constraints.maxWidth / cameraAspect)
            : constraints.maxWidth / (constraints.maxHeight * cameraAspect);

        return ClipRect(
          child: Transform(
            alignment: Alignment.center,
            // X 軸を反転（鏡像），Y 軸を反転（上下逆転）
            transform: Matrix4.diagonal3Values(-scale, -scale, 1.0),
            child: Center(
              child: AspectRatio(
                aspectRatio: cameraAspect,
                child: CameraPreview(controller),
              ),
            ),
          ),
        );
      },
    );
  }
}
