import 'package:flutter/material.dart';

import 'package:asciineverdie/src/shared/retro_colors.dart';

/// 레트로 테마 상수 모음
///
/// 패딩, 폰트 크기, 애니메이션 시간 등 UI 전반에 사용되는 상수 정의.
/// 색상은 [RetroColors] 참조.
abstract class RetroTheme {
  RetroTheme._();

  // ===========================================================================
  // 패딩 (Padding/Spacing)
  // ===========================================================================

  /// 4px - 아이콘 내부, 작은 요소 간격
  static const double paddingXs = 4.0;

  /// 8px - 텍스트 줄 간격, 버튼 내부 패딩
  static const double paddingSm = 8.0;

  /// 10px - 패널 내부 패딩 (소)
  static const double paddingMd = 10.0;

  /// 12px - 섹션 간격, 패널 내부 패딩 (중)
  static const double paddingLg = 12.0;

  /// 16px - 화면 여백, 패널 내부 패딩 (대)
  static const double paddingXl = 16.0;

  /// 24px - 화면 간 여백
  static const double paddingXxl = 24.0;

  // ===========================================================================
  // 폰트 크기 (Font Sizes)
  // ===========================================================================

  /// 8px - 라벨, 작은 힌트
  static const double fontSizeXs = 8.0;

  /// 10px - 보조 텍스트, 상태 표시
  static const double fontSizeSm = 10.0;

  /// 11px - 툴팁, 버튼 라벨
  static const double fontSizeMd = 11.0;

  /// 12px - 본문 텍스트
  static const double fontSizeLg = 12.0;

  /// 14px - 부제목
  static const double fontSizeXl = 14.0;

  /// 18px - 제목
  static const double fontSizeTitle = 18.0;

  // ===========================================================================
  // 애니메이션 시간 (Animation Durations)
  // ===========================================================================

  /// 100ms - 버튼 눌림 효과
  static const Duration animFast = Duration(milliseconds: 100);

  /// 150ms - 호버 효과
  static const Duration animQuick = Duration(milliseconds: 150);

  /// 200ms - 리스트 아이템 전환
  static const Duration animNormal = Duration(milliseconds: 200);

  /// 300ms - 패널 전환
  static const Duration animMedium = Duration(milliseconds: 300);

  /// 400ms - 페이드 인/아웃
  static const Duration animSlow = Duration(milliseconds: 400);

  /// 500ms - 결과 패널 표시
  static const Duration animResult = Duration(milliseconds: 500);

  /// 1500ms - ASCII 디스인테그레이트 효과
  static const Duration animDisintegrate = Duration(milliseconds: 1500);

  // ===========================================================================
  // 테두리 (Border)
  // ===========================================================================

  /// 기본 테두리 두께
  static const double borderWidth = 1.0;

  /// 굵은 테두리 두께
  static const double borderWidthBold = 2.0;

  /// 기본 테두리 반경 (픽셀 스타일로 0 사용)
  static const double borderRadius = 0.0;

  /// 라운드 테두리 반경 (현대적 스타일)
  static const double borderRadiusRound = 4.0;

  // ===========================================================================
  // 패널 스타일 (Panel Styles)
  // ===========================================================================

  /// 패널 기본 EdgeInsets
  static const EdgeInsets panelPadding = EdgeInsets.all(paddingMd);

  /// 패널 확장 EdgeInsets
  static const EdgeInsets panelPaddingLarge = EdgeInsets.all(paddingLg);

  /// 화면 여백 EdgeInsets
  static const EdgeInsets screenPadding = EdgeInsets.all(paddingXl);

  // ===========================================================================
  // 텍스트 스타일 팩토리 (Text Style Factories)
  // ===========================================================================

  /// 패널 제목 스타일
  static TextStyle panelTitle(BuildContext context) => TextStyle(
    fontSize: fontSizeLg,
    fontWeight: FontWeight.bold,
    color: RetroColors.goldOf(context),
  );

  /// 섹션 제목 스타일
  static TextStyle sectionTitle(BuildContext context) => TextStyle(
    fontSize: fontSizeMd,
    fontWeight: FontWeight.bold,
    color: RetroColors.textPrimaryOf(context),
  );

  /// 본문 텍스트 스타일
  static TextStyle bodyText(BuildContext context) => TextStyle(
    fontSize: fontSizeLg,
    color: RetroColors.textPrimaryOf(context),
  );

  /// 보조 텍스트 스타일
  static TextStyle bodyTextSecondary(BuildContext context) => TextStyle(
    fontSize: fontSizeSm,
    color: RetroColors.textSecondaryOf(context),
  );

  /// 뮤트 텍스트 스타일
  static TextStyle bodyTextMuted(BuildContext context) =>
      TextStyle(fontSize: fontSizeSm, color: RetroColors.textMutedOf(context));

  /// 라벨 텍스트 스타일
  static TextStyle labelText(BuildContext context) => TextStyle(
    fontSize: fontSizeXs,
    color: RetroColors.textSecondaryOf(context),
  );

  /// 숫자/통계 스타일
  static TextStyle statText(BuildContext context) => TextStyle(
    fontSize: fontSizeSm,
    fontWeight: FontWeight.bold,
    color: RetroColors.textPrimaryOf(context),
  );

  // ===========================================================================
  // 박스 데코레이션 팩토리 (Box Decoration Factories)
  // ===========================================================================

  /// 기본 패널 데코레이션
  static BoxDecoration panelDecoration(BuildContext context) => BoxDecoration(
    color: RetroColors.panelBgOf(context),
    border: Border.all(color: RetroColors.borderOf(context)),
  );

  /// 강조 패널 데코레이션 (골드 테두리)
  static BoxDecoration panelDecorationHighlight(BuildContext context) =>
      BoxDecoration(
        color: RetroColors.panelBgOf(context),
        border: Border.all(color: RetroColors.goldOf(context)),
      );

  /// 표면 데코레이션 (밝은 배경)
  static BoxDecoration surfaceDecoration(BuildContext context) => BoxDecoration(
    color: RetroColors.surfaceOf(context),
    border: Border.all(color: RetroColors.borderOf(context)),
  );
}
