import 'package:flutter/material.dart';

/// Svrnty Spacing System - 4px Grid
/// All spacing, sizing, and border radius values follow a strict 4px grid
class AppSpacing {
  // Prevent instantiation
  AppSpacing._();

  // ============================================
  // BASE SPACING SCALE (4px grid)
  // ============================================

  /// Extra small spacing (4px) - unit × 1
  static const double xs = 4.0;

  /// Small spacing (8px) - unit × 2
  static const double sm = 8.0;

  /// Medium spacing (16px) - unit × 4 - DEFAULT
  static const double md = 16.0;

  /// Large spacing (24px) - unit × 6
  static const double lg = 24.0;

  /// Extra large spacing (32px) - unit × 8
  static const double xl = 32.0;

  /// Double extra large (48px) - unit × 12
  static const double xxl = 48.0;

  /// Triple extra large (64px) - unit × 16
  static const double xxxl = 64.0;

  // ============================================
  // COMPONENT-SPECIFIC SPACING
  // ============================================

  /// Padding inside cards
  static const double cardPadding = md; // 16px

  /// Horizontal button padding
  static const double buttonPaddingX = lg; // 24px

  /// Vertical button padding
  static const double buttonPaddingY = 12.0; // sm × 1.5

  /// Padding in input fields
  static const double inputPadding = md; // 16px

  /// Standard icon size
  static const double iconSize = lg; // 24px

  /// Large icon size
  static const double iconSizeLarge = xl; // 32px

  /// Dialog content padding
  static const double dialogPadding = lg; // 24px

  /// Standard app bar height
  static const double appBarHeight = 56.0;

  /// List item padding
  static const double listItemPadding = md; // 16px

  // ============================================
  // PRE-BUILT EDGEINSETS - ALL SIDES
  // ============================================

  /// EdgeInsets.all(4px)
  static const EdgeInsets paddingAllXs = EdgeInsets.all(xs);

  /// EdgeInsets.all(8px)
  static const EdgeInsets paddingAllSm = EdgeInsets.all(sm);

  /// EdgeInsets.all(16px)
  static const EdgeInsets paddingAllMd = EdgeInsets.all(md);

  /// EdgeInsets.all(24px)
  static const EdgeInsets paddingAllLg = EdgeInsets.all(lg);

  /// EdgeInsets.all(32px)
  static const EdgeInsets paddingAllXl = EdgeInsets.all(xl);

  /// EdgeInsets.all(48px)
  static const EdgeInsets paddingAllXxl = EdgeInsets.all(xxl);

  // ============================================
  // PRE-BUILT EDGEINSETS - HORIZONTAL
  // ============================================

  /// EdgeInsets.symmetric(horizontal: 4px)
  static const EdgeInsets paddingHorizontalXs =
      EdgeInsets.symmetric(horizontal: xs);

  /// EdgeInsets.symmetric(horizontal: 8px)
  static const EdgeInsets paddingHorizontalSm =
      EdgeInsets.symmetric(horizontal: sm);

  /// EdgeInsets.symmetric(horizontal: 16px)
  static const EdgeInsets paddingHorizontalMd =
      EdgeInsets.symmetric(horizontal: md);

  /// EdgeInsets.symmetric(horizontal: 24px)
  static const EdgeInsets paddingHorizontalLg =
      EdgeInsets.symmetric(horizontal: lg);

  /// EdgeInsets.symmetric(horizontal: 32px)
  static const EdgeInsets paddingHorizontalXl =
      EdgeInsets.symmetric(horizontal: xl);

  // ============================================
  // PRE-BUILT EDGEINSETS - VERTICAL
  // ============================================

  /// EdgeInsets.symmetric(vertical: 4px)
  static const EdgeInsets paddingVerticalXs =
      EdgeInsets.symmetric(vertical: xs);

  /// EdgeInsets.symmetric(vertical: 8px)
  static const EdgeInsets paddingVerticalSm =
      EdgeInsets.symmetric(vertical: sm);

  /// EdgeInsets.symmetric(vertical: 16px)
  static const EdgeInsets paddingVerticalMd =
      EdgeInsets.symmetric(vertical: md);

  /// EdgeInsets.symmetric(vertical: 24px)
  static const EdgeInsets paddingVerticalLg =
      EdgeInsets.symmetric(vertical: lg);

  /// EdgeInsets.symmetric(vertical: 32px)
  static const EdgeInsets paddingVerticalXl =
      EdgeInsets.symmetric(vertical: xl);

  // ============================================
  // PRE-BUILT EDGEINSETS - COMPONENT SPECIFIC
  // ============================================

  /// Card padding (16px all sides)
  static const EdgeInsets paddingCard = paddingAllMd;

  /// Button padding (horizontal: 24px, vertical: 12px)
  static const EdgeInsets paddingButton =
      EdgeInsets.symmetric(horizontal: lg, vertical: buttonPaddingY);

  /// List item padding (horizontal: 16px, vertical: 8px)
  static const EdgeInsets paddingListItem =
      EdgeInsets.symmetric(horizontal: md, vertical: sm);

  /// Dialog padding (24px all sides)
  static const EdgeInsets paddingDialog = paddingAllLg;

  // ============================================
  // SPACER WIDGETS - UNIVERSAL (SQUARE)
  // ============================================

  /// SizedBox(width: 4, height: 4)
  static const Widget spacerXs = SizedBox(width: xs, height: xs);

  /// SizedBox(width: 8, height: 8)
  static const Widget spacerSm = SizedBox(width: sm, height: sm);

  /// SizedBox(width: 16, height: 16)
  static const Widget spacerMd = SizedBox(width: md, height: md);

  /// SizedBox(width: 24, height: 24)
  static const Widget spacerLg = SizedBox(width: lg, height: lg);

  /// SizedBox(width: 32, height: 32)
  static const Widget spacerXl = SizedBox(width: xl, height: xl);

  // ============================================
  // SPACER WIDGETS - VERTICAL
  // ============================================

  /// SizedBox(height: 4)
  static const Widget vSpacerXs = SizedBox(height: xs);

  /// SizedBox(height: 8)
  static const Widget vSpacerSm = SizedBox(height: sm);

  /// SizedBox(height: 16)
  static const Widget vSpacerMd = SizedBox(height: md);

  /// SizedBox(height: 24)
  static const Widget vSpacerLg = SizedBox(height: lg);

  /// SizedBox(height: 32)
  static const Widget vSpacerXl = SizedBox(height: xl);

  /// SizedBox(height: 48)
  static const Widget vSpacerXxl = SizedBox(height: xxl);

  /// SizedBox(height: 64)
  static const Widget vSpacerXxxl = SizedBox(height: xxxl);

  // ============================================
  // SPACER WIDGETS - HORIZONTAL
  // ============================================

  /// SizedBox(width: 4)
  static const Widget hSpacerXs = SizedBox(width: xs);

  /// SizedBox(width: 8)
  static const Widget hSpacerSm = SizedBox(width: sm);

  /// SizedBox(width: 16)
  static const Widget hSpacerMd = SizedBox(width: md);

  /// SizedBox(width: 24)
  static const Widget hSpacerLg = SizedBox(width: lg);

  /// SizedBox(width: 32)
  static const Widget hSpacerXl = SizedBox(width: xl);

  /// SizedBox(width: 48)
  static const Widget hSpacerXxl = SizedBox(width: xxl);

  /// SizedBox(width: 64)
  static const Widget hSpacerXxxl = SizedBox(width: xxxl);

  // ============================================
  // GAPS FOR ROW/COLUMN SPACING
  // ============================================

  /// Gap for Row/Column (4px)
  static const double gapXs = xs;

  /// Gap for Row/Column (8px)
  static const double gapSm = sm;

  /// Gap for Row/Column (16px)
  static const double gapMd = md;

  /// Gap for Row/Column (24px)
  static const double gapLg = lg;

  /// Gap for Row/Column (32px)
  static const double gapXl = xl;

  // ============================================
  // RESPONSIVE SCREEN MARGINS
  // ============================================

  /// Screen margin for mobile devices (< 600px)
  static const double screenMarginMobile = md; // 16px

  /// Screen margin for tablets (600-1024px)
  static const double screenMarginTablet = lg; // 24px

  /// Screen margin for desktop (> 1024px)
  static const double screenMarginDesktop = xl; // 32px

  /// Max content width constraint
  static const double maxContentWidth = 1200.0;

  /// Compact content width for forms/compact layouts
  static const double compactContentWidth = 600.0;

  // ============================================
  // RESPONSIVE PADDING FOR SCREENS
  // ============================================

  /// Screen padding for mobile
  static const EdgeInsets screenPaddingMobile =
      EdgeInsets.symmetric(horizontal: screenMarginMobile);

  /// Screen padding for tablet
  static const EdgeInsets screenPaddingTablet =
      EdgeInsets.symmetric(horizontal: screenMarginTablet);

  /// Screen padding for desktop
  static const EdgeInsets screenPaddingDesktop =
      EdgeInsets.symmetric(horizontal: screenMarginDesktop);

  // ============================================
  // UTILITY METHODS
  // ============================================

  /// Get responsive screen margin based on screen width
  static double getScreenMargin(double screenWidth) {
    if (screenWidth < 600) {
      return screenMarginMobile;
    } else if (screenWidth < 1024) {
      return screenMarginTablet;
    } else {
      return screenMarginDesktop;
    }
  }

  /// Get responsive screen padding based on screen width
  static EdgeInsets getScreenPadding(double screenWidth) {
    final margin = getScreenMargin(screenWidth);
    return EdgeInsets.symmetric(horizontal: margin);
  }
}
