import 'package:flutter/material.dart';
import '../../../theme/app_colors.dart';

/// 주요 액션에 사용되는 Primary 버튼
/// 저장, 추가, 확인 등의 주요 액션에 사용됩니다.
class PrimaryButton extends StatefulWidget {
  final String text;
  final VoidCallback? onPressed;
  final bool isLoading;
  final IconData? icon;
  final double? width;
  final double height;
  final Color? backgroundColor;
  final Color? foregroundColor;
  final double fontSize;
  final EdgeInsetsGeometry? padding;
  final double borderRadius;
  final bool enableHoverEffect;

  const PrimaryButton({
    super.key,
    required this.text,
    this.onPressed,
    this.isLoading = false,
    this.icon,
    this.width,
    this.height = 60,
    this.backgroundColor,
    this.foregroundColor,
    this.fontSize = 18,
    this.padding,
    this.borderRadius = 16,
    this.enableHoverEffect = true,
  });

  @override
  State<PrimaryButton> createState() => _PrimaryButtonState();
}

class _PrimaryButtonState extends State<PrimaryButton> {
  bool _isHovered = false;

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    final effectiveBackgroundColor =
        widget.backgroundColor ?? theme.primaryColor;
    final effectiveForegroundColor =
        widget.foregroundColor ?? AppColors.pureWhite;

    Widget button = AnimatedContainer(
      duration: const Duration(milliseconds: 200),
      width: widget.width ?? double.infinity,
      height: widget.height,
      transform: widget.enableHoverEffect && _isHovered
          ? (Matrix4.identity()..scale(1.02))
          : Matrix4.identity(),
      child: ElevatedButton(
        onPressed: widget.isLoading ? null : widget.onPressed,
        style: ElevatedButton.styleFrom(
          backgroundColor: effectiveBackgroundColor,
          foregroundColor: effectiveForegroundColor,
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(widget.borderRadius),
          ),
          padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 16),
          elevation: widget.enableHoverEffect && _isHovered ? 2 : 0,
          shadowColor: Colors.black.withValues(alpha: 0.08),
          disabledBackgroundColor:
              effectiveBackgroundColor.withValues(alpha: 0.6),
        ),
        child: widget.isLoading
            ? SizedBox(
                width: 24,
                height: 24,
                child: CircularProgressIndicator(
                  strokeWidth: 2.5,
                  color: effectiveForegroundColor,
                ),
              )
            : Row(
                mainAxisAlignment: MainAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: [
                  if (widget.icon != null) ...[
                    Icon(
                      widget.icon,
                      color: effectiveForegroundColor,
                      size: _isHovered ? 24 : 20,
                    ),
                    const SizedBox(width: 8),
                  ],
                  Text(
                    widget.text,
                    style: TextStyle(
                      fontSize: widget.fontSize,
                      fontWeight: FontWeight.w600,
                      color: effectiveForegroundColor,
                    ),
                  ),
                ],
              ),
      ),
    );

    if (widget.enableHoverEffect) {
      return MouseRegion(
        onEnter: (_) => setState(() => _isHovered = true),
        onExit: (_) => setState(() => _isHovered = false),
        child: button,
      );
    }

    return button;
  }
}
