/// Entité métier représentant un Pokémon. Pure : aucun import Flutter / DB / API.
class Pokemon {
  final String name;
  final int id;
  final PokemonType type1;
  final PokemonType? type2;
  final int hp;
  final int atk;
  final int def;
  final int spd;
  final String? description;
  final bool isCaught;
  final bool isSeen;

  const Pokemon({
    required this.name,
    required this.id,
    required this.type1,
    this.type2,
    required this.hp,
    required this.atk,
    required this.def,
    required this.spd,
    this.description,
    this.isCaught = false,
    this.isSeen = false,
  });

  String get imageUrl =>
      'https://raw.githubusercontent.com/Yarkis01/TyraDex/images/sprites/$id/regular.png';
  String get shinyImageUrl =>
      'https://raw.githubusercontent.com/Yarkis01/TyraDex/images/sprites/$id/shiny.png';
  String get cryUrl => 'https://pokemoncries.com/cries/$id.mp3';

  String get formatedName =>
      name.isEmpty ? name : name[0].toUpperCase() + name.substring(1);

  Pokemon copyWith({
    String? name,
    int? id,
    PokemonType? type1,
    PokemonType? type2,
    int? hp,
    int? atk,
    int? def,
    int? spd,
    String? description,
    bool? isCaught,
    bool? isSeen,
  }) {
    return Pokemon(
      name: name ?? this.name,
      id: id ?? this.id,
      type1: type1 ?? this.type1,
      type2: type2 ?? this.type2,
      hp: hp ?? this.hp,
      atk: atk ?? this.atk,
      def: def ?? this.def,
      spd: spd ?? this.spd,
      description: description ?? this.description,
      isCaught: isCaught ?? this.isCaught,
      isSeen: isSeen ?? this.isSeen,
    );
  }
}

/// Les différents types de Pokémon.
enum PokemonType {
  normal, fighting, flying, poison, ground, rock, bug, ghost, steel, fire,
  water, grass, electric, psychic, ice, dragon, dark, fairy, unknown, shadow
}
