import 'package:flutter/material.dart';
import 'color_system.dart';

/// Svrnty Gradient System
/// Predefined gradients for status bars, progress indicators, and backgrounds
class AppGradients {
  // Prevent instantiation
  AppGradients._();

  // ============================================
  // DELIVERY STATUS GRADIENTS
  // ============================================

  /// Pending status gradient (Slate Gray)
  static const LinearGradient gradientStatusPending = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.statusPending,
      Color(0xFF506576), // Slightly different shade for gradient effect
    ],
  );

  /// In Transit status gradient (Teal Blue)
  static const LinearGradient gradientStatusInTransit = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.statusInTransit,
      Color(0xFF647A91), // Lighter teal for gradient
    ],
  );

  /// Completed status gradient (Green/Success)
  static const LinearGradient gradientStatusCompleted = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.statusCompleted,
      Color(0xFF4ADE80), // Lighter green for gradient
    ],
  );

  /// Cancelled status gradient (Light Gray)
  static const LinearGradient gradientStatusCancelled = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.statusCancelled,
      Color(0xFFC5CBD2), // Darker gray for gradient
    ],
  );

  /// Failed status gradient (Red/Error)
  static const LinearGradient gradientStatusFailed = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.statusFailed,
      Color(0xFFFF7D7D), // Lighter red for gradient
    ],
  );

  // ============================================
  // PROGRESS INDICATOR GRADIENTS
  // ============================================

  /// Progress bar gradient (Blue to transparent)
  static LinearGradient gradientProgress({
    required Color color,
    bool horizontal = true,
  }) {
    return LinearGradient(
      begin: horizontal ? Alignment.centerLeft : Alignment.topCenter,
      end: horizontal ? Alignment.centerRight : Alignment.bottomCenter,
      colors: [
        color,
        color.withValues(alpha: 0.8),
      ],
    );
  }

  /// Success progress gradient
  static const LinearGradient gradientProgressSuccess = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.success,
      Color(0xFF4ADE80), // Lighter green
    ],
  );

  /// Warning progress gradient
  static const LinearGradient gradientProgressWarning = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.warning,
      Color(0xFFFBBF24), // Lighter amber
    ],
  );

  /// Error progress gradient
  static const LinearGradient gradientProgressError = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.error,
      Color(0xFFFF7D7D), // Lighter red
    ],
  );

  /// Info progress gradient
  static const LinearGradient gradientProgressInfo = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      SvrntyColors.info,
      Color(0xFF5B9BFF), // Lighter blue
    ],
  );

  // ============================================
  // BRAND GRADIENTS
  // ============================================

  /// Primary brand gradient (Crimson Red)
  static const LinearGradient gradientPrimary = LinearGradient(
    begin: Alignment.topLeft,
    end: Alignment.bottomRight,
    colors: [
      SvrntyColors.crimsonRed,
      Color(0xFFC44D58), // Slightly darker shade
    ],
  );

  /// Secondary brand gradient (Slate Blue)
  static const LinearGradient gradientSecondary = LinearGradient(
    begin: Alignment.topLeft,
    end: Alignment.bottomRight,
    colors: [
      SvrntyColors.darkSlate,
      SvrntyColors.slateGray,
    ],
  );

  /// Accent gradient (Crimson to Slate)
  static const LinearGradient gradientAccent = LinearGradient(
    begin: Alignment.topLeft,
    end: Alignment.bottomRight,
    colors: [
      SvrntyColors.crimsonRed,
      SvrntyColors.darkSlate,
    ],
  );

  // ============================================
  // BACKGROUND GRADIENTS
  // ============================================

  /// Light background gradient
  static const LinearGradient gradientBackgroundLight = LinearGradient(
    begin: Alignment.topLeft,
    end: Alignment.bottomRight,
    colors: [
      Color(0xFFFAFAFC),
      Color(0xFFF5F7FA),
    ],
  );

  /// Dark background gradient
  static const LinearGradient gradientBackgroundDark = LinearGradient(
    begin: Alignment.topLeft,
    end: Alignment.bottomRight,
    colors: [
      Color(0xFF1A1C1E),
      Color(0xFF2A2D34),
    ],
  );

  /// Elevated surface gradient (light)
  static const LinearGradient gradientElevatedLight = LinearGradient(
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
    colors: [
      Color(0xFFFFFFFF),
      Color(0xFFF5F7FA),
    ],
  );

  /// Elevated surface gradient (dark)
  static const LinearGradient gradientElevatedDark = LinearGradient(
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
    colors: [
      Color(0xFF2A2D34),
      Color(0xFF1F2123),
    ],
  );

  // ============================================
  // OVERLAY GRADIENTS
  // ============================================

  /// Dark overlay gradient (for images)
  static const LinearGradient gradientOverlayDark = LinearGradient(
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
    colors: [
      Color(0x00000000), // Transparent at top
      Color(0x4D000000), // Dark at bottom
    ],
  );

  /// Light overlay gradient
  static const LinearGradient gradientOverlayLight = LinearGradient(
    begin: Alignment.topCenter,
    end: Alignment.bottomCenter,
    colors: [
      Color(0x00FFFFFF), // Transparent at top
      Color(0x4DFFFFFF), // Light at bottom
    ],
  );

  /// Vignette gradient (darkened edges)
  static const RadialGradient gradientVignette = RadialGradient(
    center: Alignment.center,
    radius: 1.2,
    colors: [
      Color(0x00000000),
      Color(0x80000000),
    ],
  );

  // ============================================
  // SHIMMER GRADIENTS (for loading states)
  // ============================================

  /// Shimmer gradient light theme
  static const LinearGradient gradientShimmerLight = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      Color(0xFFFFFFFF),
      Color(0x80F0F0F0),
      Color(0xFFFFFFFF),
    ],
    stops: [0.1, 0.5, 0.9],
  );

  /// Shimmer gradient dark theme
  static const LinearGradient gradientShimmerDark = LinearGradient(
    begin: Alignment.centerLeft,
    end: Alignment.centerRight,
    colors: [
      Color(0xFF2A2D34),
      Color(0xFF383940),
      Color(0xFF2A2D34),
    ],
    stops: [0.1, 0.5, 0.9],
  );

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

  /// Get status gradient based on delivery status
  static LinearGradient getStatusGradient(String status) {
    switch (status.toLowerCase()) {
      case 'pending':
        return gradientStatusPending;
      case 'in_transit':
      case 'in_progress':
      case 'inprogress':
        return gradientStatusInTransit;
      case 'completed':
      case 'done':
        return gradientStatusCompleted;
      case 'cancelled':
      case 'skipped':
        return gradientStatusCancelled;
      case 'failed':
        return gradientStatusFailed;
      default:
        return gradientStatusPending;
    }
  }

  /// Get progress gradient based on status
  static LinearGradient getProgressGradient(String status) {
    switch (status.toLowerCase()) {
      case 'success':
        return gradientProgressSuccess;
      case 'warning':
        return gradientProgressWarning;
      case 'error':
        return gradientProgressError;
      case 'info':
        return gradientProgressInfo;
      default:
        return gradientProgressSuccess;
    }
  }

  /// Create a custom gradient with opacity
  static LinearGradient withOpacity(
    LinearGradient gradient,
    double opacity,
  ) {
    return LinearGradient(
      begin: gradient.begin,
      end: gradient.end,
      colors: gradient.colors
          .map((color) => color.withValues(alpha: opacity))
          .toList(),
      stops: gradient.stops,
    );
  }

  /// Create a directional gradient
  static LinearGradient directional({
    required List<Color> colors,
    required Alignment begin,
    required Alignment end,
    List<double>? stops,
  }) {
    return LinearGradient(
      begin: begin,
      end: end,
      colors: colors,
      stops: stops,
    );
  }
}
