import 'dart:ui' show lerpDouble;

import 'package:flutter/material.dart';

@immutable
class PluriWaveTokens extends ThemeExtension<PluriWaveTokens> {
  const PluriWaveTokens({
    required this.deepViolet,
    required this.electricMagenta,
    required this.warmCoral,
    required this.glassSurface,
    required this.glassBorder,
    required this.glowColor,
    required this.radiusSm,
    required this.radiusMd,
    required this.radiusLg,
    required this.spacingXs,
    required this.spacingSm,
    required this.spacingMd,
    required this.spacingLg,
  });

  final Color deepViolet;
  final Color electricMagenta;
  final Color warmCoral;
  final Color glassSurface;
  final Color glassBorder;
  final Color glowColor;

  final double radiusSm;
  final double radiusMd;
  final double radiusLg;

  final double spacingXs;
  final double spacingSm;
  final double spacingMd;
  final double spacingLg;

  static const dark = PluriWaveTokens(
    deepViolet: Color(0xFF07121A),
    electricMagenta: Color(0xFF21D4D9),
    warmCoral: Color(0xFFF4B860),
    glassSurface: Color(0x1FFFFFFF),
    glassBorder: Color(0x33FFFFFF),
    glowColor: Color(0x6621D4D9),
    radiusSm: 14,
    radiusMd: 22,
    radiusLg: 30,
    spacingXs: 4,
    spacingSm: 8,
    spacingMd: 16,
    spacingLg: 24,
  );

  @override
  PluriWaveTokens copyWith({
    Color? deepViolet,
    Color? electricMagenta,
    Color? warmCoral,
    Color? glassSurface,
    Color? glassBorder,
    Color? glowColor,
    double? radiusSm,
    double? radiusMd,
    double? radiusLg,
    double? spacingXs,
    double? spacingSm,
    double? spacingMd,
    double? spacingLg,
  }) {
    return PluriWaveTokens(
      deepViolet: deepViolet ?? this.deepViolet,
      electricMagenta: electricMagenta ?? this.electricMagenta,
      warmCoral: warmCoral ?? this.warmCoral,
      glassSurface: glassSurface ?? this.glassSurface,
      glassBorder: glassBorder ?? this.glassBorder,
      glowColor: glowColor ?? this.glowColor,
      radiusSm: radiusSm ?? this.radiusSm,
      radiusMd: radiusMd ?? this.radiusMd,
      radiusLg: radiusLg ?? this.radiusLg,
      spacingXs: spacingXs ?? this.spacingXs,
      spacingSm: spacingSm ?? this.spacingSm,
      spacingMd: spacingMd ?? this.spacingMd,
      spacingLg: spacingLg ?? this.spacingLg,
    );
  }

  @override
  PluriWaveTokens lerp(covariant ThemeExtension<PluriWaveTokens>? other, double t) {
    if (other is! PluriWaveTokens) return this;
    return PluriWaveTokens(
      deepViolet: Color.lerp(deepViolet, other.deepViolet, t) ?? deepViolet,
      electricMagenta: Color.lerp(electricMagenta, other.electricMagenta, t) ?? electricMagenta,
      warmCoral: Color.lerp(warmCoral, other.warmCoral, t) ?? warmCoral,
      glassSurface: Color.lerp(glassSurface, other.glassSurface, t) ?? glassSurface,
      glassBorder: Color.lerp(glassBorder, other.glassBorder, t) ?? glassBorder,
      glowColor: Color.lerp(glowColor, other.glowColor, t) ?? glowColor,
      radiusSm: lerpDouble(radiusSm, other.radiusSm, t) ?? radiusSm,
      radiusMd: lerpDouble(radiusMd, other.radiusMd, t) ?? radiusMd,
      radiusLg: lerpDouble(radiusLg, other.radiusLg, t) ?? radiusLg,
      spacingXs: lerpDouble(spacingXs, other.spacingXs, t) ?? spacingXs,
      spacingSm: lerpDouble(spacingSm, other.spacingSm, t) ?? spacingSm,
      spacingMd: lerpDouble(spacingMd, other.spacingMd, t) ?? spacingMd,
      spacingLg: lerpDouble(spacingLg, other.spacingLg, t) ?? spacingLg,
    );
  }
}
