import 'package:flutter/material.dart';

/// Identidade visual do app — Raro Labs.
///
/// A cor da marca é **#615FF6**. Ela entra como semente do esquema Material 3,
/// mas com uma escolha explícita: `DynamicSchemeVariant.fidelity` em vez do
/// `tonalSpot` padrão do Flutter.
///
/// O motivo é medido, não estético: com `tonalSpot` a semente vira `#595992` —
/// um violeta acinzentado que **não é** a cor da marca. Com `fidelity`, o
/// `primary` fica `#4743DC` (contraste 6.76 com branco) e o `primaryContainer`
/// fica **exatamente `#615FF6`**, então a cor da marca aparece literalmente na
/// tela em vez de virar uma aproximação apagada.
///
/// As cores **semânticas** (sucesso, campeão) não seguem a marca de propósito:
/// verde quer dizer "deu certo" e dourado quer dizer "campeão" em qualquer app.
/// Pintar sucesso de violeta apagaria o sinal — a cor deixaria de informar.
abstract final class CoresDoApp {
  /// Cor da marca: RGB(97, 95, 246).
  static const marca = Color(0xFF615FF6);

  /// Confirmação de ação. Verde 800, **não** o 700 que estava no código: com
  /// texto branco, o 700 dá contraste 4.12 e reprova o mínimo de 4.5 da WCAG AA.
  /// O 800 dá 5.13.
  static const sucesso = Color(0xFF2E7D32);

  /// Título de campeão. O âmbar 700 que estava aqui dava contraste **2.04**
  /// sobre branco — abaixo até do mínimo de 3.0 para ícone, ou seja, o troféu
  /// quase desaparecia para quem tem baixa visão. Este dourado dá 5.10 e
  /// continua lendo como "ouro".
  static const campeao = Color(0xFF946500);
}

/// Tema claro do app.
///
/// O **fundo é branco puro**, por pedido do dono em 07/08. O Material 3 tinge as
/// superfícies com a semente por padrão (o fundo saía `#FCF8FF`, um lilás quase
/// imperceptível); aqui as superfícies de página são forçadas para `#FFFFFF`.
///
/// As superfícies **elevadas** — barra de navegação, diálogo, menu — mantêm o
/// tom tonal de propósito: é o que separa "o que está por cima" de "a página".
/// Se tudo virar branco, o diálogo perde a borda visual e a barra de baixo se
/// funde com a lista.
ThemeData temaDoApp() {
  final base = ColorScheme.fromSeed(
    seedColor: CoresDoApp.marca,
    dynamicSchemeVariant: DynamicSchemeVariant.fidelity,
  );
  final cores = base.copyWith(
    surface: Colors.white,
    surfaceContainerLowest: Colors.white,
    surfaceContainerLow: Colors.white,
  );

  return ThemeData(
    colorScheme: cores,
    useMaterial3: true,
    scaffoldBackgroundColor: Colors.white,
    // A `AppBar` do M3 usa `surface` e ganha um tom ao rolar a lista; sem fixar,
    // o topo escurece sozinho e deixa de ser branco no meio da rolagem.
    appBarTheme: const AppBarTheme(
      backgroundColor: Colors.white,
      surfaceTintColor: Colors.transparent,
      scrolledUnderElevation: 0,
    ),
    // Mesmo motivo: cartão e superfície de rolagem não recebem tinta.
    cardTheme: const CardThemeData(
      color: Colors.white,
      surfaceTintColor: Colors.transparent,
    ),
    inputDecorationTheme: const InputDecorationTheme(
      border: OutlineInputBorder(),
    ),
    // Snackbar de confirmação usa a cor semântica, não a da marca. Fica aqui
    // para as cinco telas que mostram "salvo" pararem de repetir a cor na mão.
    snackBarTheme: SnackBarThemeData(
      behavior: SnackBarBehavior.fixed,
      contentTextStyle: const TextStyle(color: Colors.white),
      backgroundColor: cores.inverseSurface,
    ),
  );
}
