import 'package:flutter/material.dart';

class AppDimensions {
  // Private constructor to prevent instantiation
  AppDimensions._();

  // Screen breakpoints
  static const double smallScreenWidth = 460;
  static const double tabletWidth = 600;
  static const double largeScreenWidth = 1200;

  // Padding values
  static const double paddingXS = 4.0;
  static const double paddingS = 8.0;
  static const double paddingM = 12.0;
  static const double paddingL = 16.0;
  static const double paddingXL = 25.0;
  static const double paddingXXL = 30.0;
  static const double paddingXXXL = 30.0;
  static const double paddingHuge = 40.0;

  // Spacing values
  static const double spacingXS = 4.0;
  static const double spacingS = 8.0;
  static const double spacingM = 12.0;
  static const double spacingL = 16.0;
  static const double spacingXL = 20.0;
  static const double spacingXXL = 23.0;
  static const double spacingXXXL = 30.0;
  static const double spacingHuge = 40.0;

  // Font sizes
  static const double fontSizeXS = 10.0;
  static const double fontSizeS = 12.0;
  static const double fontSizeM = 14.0;
  static const double fontSizeL = 16.0;
  static const double fontSizeXL = 18.0;
  static const double fontSizeXXL = 20.0;
  static const double fontSizeXXXL = 22.0;
  static const double fontSizeHuge = 24.0;
  static const double fontSizeTitle = 36.0;
  static const double fontSizeTitleLarge = 42.0;

  // Icon sizes
  static const double iconSizeXS = 16.0;
  static const double iconSizeS = 20.0;
  static const double iconSizeM = 24.0;
  static const double iconSizeL = 30.0;
  static const double iconSizeXL = 33.0;
  static const double iconSizeXXL = 40.0;
  static const double iconSizeHuge = 60.0;

  // Border radius
  static const double radiusXS = 3.0;
  static const double radiusS = 5.0;
  static const double radiusM = 8.0;
  static const double radiusL = 10.0;
  static const double radiusXL = 15.0;
  static const double radiusXXL = 20.0;
  static const double radiusCircle = 50.0;

  // Button heights
  static const double buttonHeightS = 40.0;
  static const double buttonHeightM = 48.0;
  static const double buttonHeightL = 56.0;

  // Image heights
  static const double imageHeightS = 150.0;
  static const double imageHeightM = 200.0;
  static const double imageHeightL = 250.0;

  // Page indicator sizes
  static const double pageIndicatorSize = 10.0;
  static const double pageIndicatorSizeActive = 16.0;

  // Responsive methods
  static bool isSmallScreen(BuildContext context) {
    return MediaQuery.of(context).size.width < smallScreenWidth;
  }

  static bool isTablet(BuildContext context) {
    final width = MediaQuery.of(context).size.width;
    return width >= tabletWidth && width < largeScreenWidth;
  }

  static bool isLargeScreen(BuildContext context) {
    return MediaQuery.of(context).size.width >= largeScreenWidth;
  }

  // Responsive padding
  static double getHorizontalPadding(BuildContext context) {
    return isSmallScreen(context) ? paddingXL : paddingXXL;
  }

  static double getVerticalPadding(BuildContext context) {
    return isSmallScreen(context) ? paddingL : paddingXXL;
  }

  // Responsive font size
  static double getTitleFontSize(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;
    if (isSmallScreen(context)) {
      return screenWidth * 0.07;
    } else if (isTablet(context)) {
      return fontSizeTitleLarge;
    } else {
      return screenWidth * 0.08;
    }
  }

  static double getSubtitleFontSize(BuildContext context) {
    return isSmallScreen(context) ? fontSizeM : fontSizeL;
  }

  static double getBodyFontSize(BuildContext context) {
    return isSmallScreen(context) ? fontSizeS : fontSizeM;
  }

  // Responsive spacing
  static double getVerticalSpacing(BuildContext context) {
    return isSmallScreen(context) ? spacingL : spacingXXL;
  }

  static double getSmallVerticalSpacing(BuildContext context) {
    return isSmallScreen(context) ? spacingM : spacingL;
  }

  // Responsive icon size
  static double getIconSize(BuildContext context) {
    return isSmallScreen(context) ? iconSizeM : iconSizeXL;
  }

  // Screen dimensions
  static double screenWidth(BuildContext context) {
    return MediaQuery.of(context).size.width;
  }

  static double screenHeight(BuildContext context) {
    return MediaQuery.of(context).size.height;
  }

  // Safe area padding
  static EdgeInsets getSafeAreaPadding(BuildContext context) {
    return MediaQuery.of(context).padding;
  }
}
