// SPDX-FileCopyrightText: 2026 FocusFlow contributors
// SPDX-License-Identifier: AGPL-3.0-only

/// Defines Scheduler Visual Tokens styling for the FocusFlow Flutter UI.
library;

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

/// Maps scheduler domain tokens to Flutter colors and icons.
abstract final class SchedulerVisualTokens {
  /// Returns the color associated with a project color [token].
  static Color projectColor(String token) {
    return switch (token) {
      'home' => const Color(0xFF68B0AB),
      'inbox' => const Color(0xFFB7B56D),
      _ => const Color(0xFFB8C7CC),
    };
  }

  /// Returns the background color associated with a timeline background token.
  static Color backgroundColor(
    TimelineBackgroundToken token,
    ColorScheme scheme,
  ) {
    return switch (token) {
      TimelineBackgroundToken.flexible => scheme.surfaceContainerHighest,
      TimelineBackgroundToken.inflexible => const Color(0xFF1E3641),
      TimelineBackgroundToken.critical => const Color(0xFF463638),
      TimelineBackgroundToken.locked => const Color(0xFF252B30),
      TimelineBackgroundToken.surprise => const Color(0xFF303C2A),
      TimelineBackgroundToken.freeSlot => const Color(0xFF243B3A),
    };
  }

  /// Returns the icon associated with a task [type].
  static IconData taskIcon(TaskType type) {
    return switch (type) {
      TaskType.flexible => Icons.task_alt,
      TaskType.inflexible => Icons.event,
      TaskType.critical => Icons.priority_high,
      TaskType.locked => Icons.lock_outline,
      TaskType.surprise => Icons.bolt,
      TaskType.freeSlot => Icons.self_improvement,
    };
  }

  /// Returns the icon associated with a reward token.
  static IconData rewardIcon(TimelineRewardIconToken token) {
    return switch (token) {
      TimelineRewardIconToken.notSet => Icons.remove_circle_outline,
      TimelineRewardIconToken.veryLow => Icons.looks_one_outlined,
      TimelineRewardIconToken.low => Icons.looks_two_outlined,
      TimelineRewardIconToken.medium => Icons.looks_3_outlined,
      TimelineRewardIconToken.high => Icons.looks_4_outlined,
      TimelineRewardIconToken.veryHigh => Icons.looks_5_outlined,
    };
  }

  /// Returns the icon associated with a difficulty token.
  static IconData difficultyIcon(TimelineDifficultyIconToken token) {
    return switch (token) {
      TimelineDifficultyIconToken.notSet => Icons.remove_circle_outline,
      TimelineDifficultyIconToken.veryEasy => Icons.filter_1,
      TimelineDifficultyIconToken.easy => Icons.filter_2,
      TimelineDifficultyIconToken.medium => Icons.filter_3,
      TimelineDifficultyIconToken.hard => Icons.filter_4,
      TimelineDifficultyIconToken.veryHard => Icons.filter_5,
    };
  }

  /// Returns the icon associated with a backlog staleness marker.
  static IconData stalenessIcon(BacklogStalenessMarker marker) {
    return switch (marker) {
      BacklogStalenessMarker.green => Icons.circle,
      BacklogStalenessMarker.blue => Icons.adjust,
      BacklogStalenessMarker.purple => Icons.change_history,
    };
  }

  /// Returns the color associated with a backlog staleness marker.
  static Color stalenessColor(
    BacklogStalenessMarker marker,
    ColorScheme scheme,
  ) {
    return switch (marker) {
      BacklogStalenessMarker.green => const Color(0xFF76B981),
      BacklogStalenessMarker.blue => const Color(0xFF80A7D8),
      BacklogStalenessMarker.purple => const Color(0xFFB594D1),
    };
  }
}
