import 'package:commons_core/commons_core.dart';
import 'package:flutter/material.dart';
import 'package:material_symbols_icons/symbols.dart';

import '../db/enums.dart';

/// Renders a glyph from the bundled `seedks` icon font, whose characters `a`–`k`
/// map to seed-themed pictograms (jar, packet, spoon…). See
/// docs/mockups/seedks-glyphs.png.
class SeedGlyph extends StatelessWidget {
  const SeedGlyph(this.char, {this.size = 24, this.color, super.key});

  final String char;
  final double size;
  final Color? color;

  @override
  Widget build(BuildContext context) {
    return Text(
      char,
      style: TextStyle(
        fontFamily: 'seedks',
        fontSize: size,
        height: 1,
        color: color ?? Theme.of(context).colorScheme.primary,
      ),
    );
  }
}

/// Named seedks glyphs (the character each pictogram is mapped to).
abstract final class SeedGlyphs {
  static const jar = 'a';
  static const jars = 'b';
  static const search = 'c';
  static const share = 'd';
  static const sack = 'e';
  static const smallSpoon = 'f';
  static const bigSpoon = 'g';
  static const mug = 'h';
  static const envelope = 'i';
  static const pouring = 'j';
  static const scattered = 'k';
}

/// The seedks character for a quantity [kind], or null for plant-form/precise
/// kinds that have no seed pictogram (they fall back to a Material icon).
String? seedGlyphForKind(QuantityKind kind) => switch (kind) {
  QuantityKind.aFew => SeedGlyphs.scattered,
  QuantityKind.some => SeedGlyphs.smallSpoon,
  QuantityKind.plenty => SeedGlyphs.jars,
  QuantityKind.pinch => SeedGlyphs.scattered,
  QuantityKind.handful => SeedGlyphs.bigSpoon,
  QuantityKind.teaspoon => SeedGlyphs.smallSpoon,
  QuantityKind.spoon => SeedGlyphs.bigSpoon,
  QuantityKind.cup => SeedGlyphs.mug,
  QuantityKind.jar => SeedGlyphs.jar,
  QuantityKind.sack => SeedGlyphs.sack,
  QuantityKind.packet => SeedGlyphs.pouring,
  _ => null,
};

IconData _materialIconForKind(QuantityKind kind) => switch (kind) {
  QuantityKind.grams => Icons.scale_outlined,
  QuantityKind.count => Icons.tag,
  // Seed/fruit forms — each a distinct icon so they're told apart at a glance.
  QuantityKind.cob => Symbols.grass, // mazorca
  QuantityKind.ear => Symbols.grain, // espiga
  QuantityKind.head => Symbols.filter_vintage, // cabezuela
  QuantityKind.seedHead => Symbols.spa,
  QuantityKind.fruit => Symbols.nutrition, // fruto (apple)
  QuantityKind.bulb => Symbols.spa, // bulbo
  QuantityKind.tuber => Symbols.egg, // tubérculo
  QuantityKind.bunch => Symbols.local_florist, // manojo
  // Living material counted as individuals.
  QuantityKind.seedling => Symbols.potted_plant,
  QuantityKind.plant => Symbols.yard,
  QuantityKind.tree => Symbols.park,
  QuantityKind.cutting => Symbols.content_cut,
  QuantityKind.pot => Symbols.yard,
  QuantityKind.tray => Symbols.grid_on,
  _ => Icons.eco_outlined,
};

/// The icon for a lot's [LotType] form (used in the form selector and lot chip),
/// distinct across all forms so the selector reads clearly.
IconData iconForLotType(LotType type) => switch (type) {
  LotType.seed => Symbols.eco, // overridden by a seed glyph where shown
  LotType.seedling => Symbols.potted_plant,
  LotType.plant => Symbols.local_florist,
  LotType.tree => Symbols.park,
  LotType.bulb => Symbols.spa,
  LotType.cutting => Symbols.content_cut,
};

/// A consistent icon for a [QuantityKind]: the seed glyph where one exists,
/// otherwise a Material fallback.
class QuantityKindIcon extends StatelessWidget {
  const QuantityKindIcon(this.kind, {this.size = 24, this.color, super.key});

  final QuantityKind kind;
  final double size;
  final Color? color;

  @override
  Widget build(BuildContext context) {
    final glyph = seedGlyphForKind(kind);
    if (glyph != null) return SeedGlyph(glyph, size: size, color: color);
    return Icon(
      _materialIconForKind(kind),
      size: size,
      color: color ?? Theme.of(context).colorScheme.primary,
    );
  }
}
