import 'package:flutter/material.dart';

import 'package:asciineverdie/l10n/app_localizations.dart';
import 'package:asciineverdie/src/core/model/game_state.dart';
import 'package:asciineverdie/src/features/game/widgets/victory_credit_content.dart';
import 'package:asciineverdie/src/shared/retro_colors.dart';

/// 게임 클리어 엔딩 오버레이(overlay) - Act V 완료 시
///
/// 영화 엔딩 크레딧 스타일로 텍스트가 아래에서 위로 스크롤됨
/// - 탭/클릭 시 스크롤 최하단으로 즉시 이동
/// - 최하단에 명예의 전당 버튼 표시
class VictoryOverlay extends StatefulWidget {
  const VictoryOverlay({
    super.key,
    required this.traits,
    required this.stats,
    required this.progress,
    required this.elapsedMs,
    required this.onComplete,
  });

  final Traits traits;
  final Stats stats;
  final ProgressState progress;
  final int elapsedMs;

  /// 엔딩 완료 콜백(callback) - 명예의 전당으로 이동
  final VoidCallback onComplete;

  @override
  State<VictoryOverlay> createState() => _VictoryOverlayState();
}

class _VictoryOverlayState extends State<VictoryOverlay>
    with SingleTickerProviderStateMixin {
  late AnimationController _animationController;
  late Animation<double> _scrollAnimation;

  // 스크롤이 완료(최하단 도달) 되었는지 여부
  bool _isScrollComplete = false;

  // 터치 중인지 여부 (터치 시 속도업)
  bool _isTouching = false;

  // 스크롤 완료 후 수동 스크롤용 컨트롤러
  late ScrollController _manualScrollController;

  // 스크롤 지속 시간 (밀리초)
  static const _scrollDurationMs = 25000; // 25초 (기본 속도)
  static const _fastScrollDurationMs = 5000; // 5초 (빠른 속도, 5배속)

  @override
  void initState() {
    super.initState();

    _manualScrollController = ScrollController();

    _animationController = AnimationController(
      duration: const Duration(milliseconds: _scrollDurationMs),
      vsync: this,
    );

    _scrollAnimation = Tween<double>(begin: 0.0, end: 1.0).animate(
      CurvedAnimation(parent: _animationController, curve: Curves.linear),
    );

    // 스크롤 완료 시 수동 스크롤 모드로 전환
    _animationController.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        _onScrollComplete();
      }
    });

    _animationController.forward();
  }

  @override
  void dispose() {
    _animationController.dispose();
    _manualScrollController.dispose();
    super.dispose();
  }

  /// 스크롤 완료 시 호출
  void _onScrollComplete() {
    setState(() {
      _isScrollComplete = true;
    });
    // 수동 스크롤 시 맨 아래에서 시작
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (_manualScrollController.hasClients) {
        _manualScrollController.jumpTo(
          _manualScrollController.position.maxScrollExtent,
        );
      }
    });
  }

  /// 터치 시작 - 스크롤 속도업(speed up)
  void _onTouchStart() {
    if (_isScrollComplete) return;

    setState(() {
      _isTouching = true;
    });

    // 현재 진행도(progress) 저장
    final currentProgress = _animationController.value;
    final remainingProgress = 1.0 - currentProgress;

    // 남은 시간 계산 (빠른 속도 기준)
    final remainingDuration = Duration(
      milliseconds: (remainingProgress * _fastScrollDurationMs).toInt(),
    );

    _animationController.duration = remainingDuration;
    _animationController.forward(from: currentProgress);
  }

  /// 터치 종료 - 스크롤 속도 복원
  void _onTouchEnd() {
    if (_isScrollComplete) return;

    setState(() {
      _isTouching = false;
    });

    // 현재 진행도 저장
    final currentProgress = _animationController.value;
    final remainingProgress = 1.0 - currentProgress;

    // 남은 시간 계산 (기본 속도 기준)
    final remainingDuration = Duration(
      milliseconds: (remainingProgress * _scrollDurationMs).toInt(),
    );

    _animationController.duration = remainingDuration;
    _animationController.forward(from: currentProgress);
  }

  @override
  Widget build(BuildContext context) {
    final gold = RetroColors.goldOf(context);
    final l10n = L10n.of(context);

    return GestureDetector(
      // 터치 시 스크롤 속도업 (스크롤 중에만)
      onTapDown: _isScrollComplete ? null : (_) => _onTouchStart(),
      onTapUp: _isScrollComplete ? null : (_) => _onTouchEnd(),
      onTapCancel: _isScrollComplete ? null : _onTouchEnd,
      onLongPressStart: _isScrollComplete ? null : (_) => _onTouchStart(),
      onLongPressEnd: _isScrollComplete ? null : (_) => _onTouchEnd(),
      onLongPressCancel: _isScrollComplete ? null : _onTouchEnd,
      child: Material(
        color: Colors.black,
        child: SafeArea(
          child: Stack(
            children: [
              // 스크롤 중: 애니메이션 기반 스크롤
              // 스크롤 완료: 수동 스크롤 가능
              if (!_isScrollComplete)
                AnimatedBuilder(
                  animation: _scrollAnimation,
                  builder: (context, child) {
                    return _buildScrollingCredits(context);
                  },
                )
              else
                _buildManualScrollableCredits(context),

              // 하단 터치 힌트 (스크롤 중에만 표시)
              if (!_isScrollComplete)
                Positioned(
                  bottom: 16,
                  left: 0,
                  right: 0,
                  child: AnimatedOpacity(
                    opacity: _isTouching ? 0.0 : 1.0,
                    duration: const Duration(milliseconds: 200),
                    child: Text(
                      l10n.endingHoldToSpeedUp,
                      style: TextStyle(
                        fontFamily: 'PressStart2P',
                        fontSize: 13,
                        color: Colors.white.withValues(alpha: 0.3),
                      ),
                      textAlign: TextAlign.center,
                    ),
                  ),
                ),

              // 속도업 표시 (터치 중에만 표시)
              if (!_isScrollComplete && _isTouching)
                Positioned(
                  top: 16,
                  right: 16,
                  child: Container(
                    padding: const EdgeInsets.symmetric(
                      horizontal: 8,
                      vertical: 4,
                    ),
                    decoration: BoxDecoration(
                      color: gold.withValues(alpha: 0.2),
                      borderRadius: BorderRadius.circular(4),
                    ),
                    child: Text(
                      '▶▶ x5',
                      style: TextStyle(
                        fontFamily: 'PressStart2P',
                        fontSize: 14,
                        color: gold,
                      ),
                    ),
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildScrollingCredits(BuildContext context) {
    final screenHeight = MediaQuery.of(context).size.height;
    final contentHeight = _estimateContentHeight();

    // 스크롤 오프셋(offset): 화면 아래에서 시작 → 화면 위로 사라짐
    final totalScrollDistance = screenHeight + contentHeight;
    final currentOffset =
        screenHeight - (_scrollAnimation.value * totalScrollDistance);

    return SingleChildScrollView(
      physics: const NeverScrollableScrollPhysics(),
      child: Transform.translate(
        offset: Offset(0, currentOffset),
        child: _buildCreditContent(),
      ),
    );
  }

  /// 수동 스크롤 가능한 크레딧 (스크롤 완료 후)
  Widget _buildManualScrollableCredits(BuildContext context) {
    return SingleChildScrollView(
      controller: _manualScrollController,
      physics: const BouncingScrollPhysics(),
      child: _buildCreditContent(),
    );
  }

  double _estimateContentHeight() {
    // 대략적인 콘텐츠 높이 추정 (스크롤 계산용)
    return 1600.0;
  }

  Widget _buildCreditContent() {
    return VictoryCreditContent(
      traits: widget.traits,
      stats: widget.stats,
      progress: widget.progress,
      elapsedMs: widget.elapsedMs,
      onComplete: widget.onComplete,
    );
  }
}
