enum CharacterType { Survivor, Hunter }

class Character {
  final String name;
  final CharacterType type;
  final String backstory;
  final String imageUrl;
  bool isLiked;

  Character({
    required this.name,
    required this.type,
    required this.backstory,
    required this.imageUrl,
    this.isLiked = false, // Значение по умолчанию - false
  });

  factory Character.fromJson(Map<String, dynamic> json) {
    try {
      CharacterType characterType;
      if (json['type'] == 'Выживший') {
        characterType = CharacterType.Survivor;
      } else if (json['type'] == 'Охотник') {
        characterType = CharacterType.Hunter;
      } else {
        throw Exception('Неизвестный тип персонажа: ${json['type']}');
      }

      return Character(
        name: json['name'],
        type: characterType,
        backstory: json['backstory'],
        imageUrl: json['image_url'],  // Используем корректный URL
      );
    } catch (e) {
      print("Ошибка при парсинге данных: $e");
      throw Exception('Ошибка при парсинге персонажа');
    }
  }

  // Преобразуем тип обратно в строку
  String get typeString {
    switch (type) {
      case CharacterType.Survivor:
        return 'Выживший';
      case CharacterType.Hunter:
        return 'Охотник';
      default:
        return 'Неизвестно';
    }
  }

  String getInfo() {
    return '$typeString - $backstory';
  }

  // Для пустого объекта
  static Character? empty() {
    return null; // Возвращаем null для пустого объекта
  }
}

class Survivor extends Character {
  Survivor({
    required String name,
    required String backstory,
    required String imageUrl,
  }) : super(
    name: name,
    backstory: backstory,
    imageUrl: imageUrl,
    type: CharacterType.Survivor,
  );
}

class Hunter extends Character {
  Hunter({
    required String name,
    required String backstory,
    required String imageUrl,
  }) : super(
    name: name,
    backstory: backstory,
    imageUrl: imageUrl,
    type: CharacterType.Hunter,
  );
}

class CharacterDTO {
  final String name;
  final String characterType;
  final String backstory;
  final String imageUrl;

  CharacterDTO({
    required this.name,
    required this.characterType,
    required this.backstory,
    required this.imageUrl,
  });

  CharacterDTO toDTO() {
    return CharacterDTO(
      name: name,
      characterType: typeString,
      backstory: backstory,
      imageUrl: imageUrl,
    );
  }

  // Добавим метод fromJson
  factory CharacterDTO.fromJson(Map<String, dynamic> json) {
    return CharacterDTO(
      name: json['name'],
      characterType: json['type'],
      backstory: json['backstory'],
      imageUrl: json['image_url'],
    );
  }

  // Геттер для typeString
  String get typeString {
    switch (characterType) {
      case 'Выживший':
        return 'Выживший';
      case 'Охотник':
        return 'Охотник';
      default:
        return 'Неизвестно';
    }
  }

  // Преобразуем DTO обратно в объект Character
  Character toCharacter() {
    return Character(
      name: name,
      type: characterType == 'Выживший' ? CharacterType.Survivor : CharacterType.Hunter,
      backstory: backstory,
      imageUrl: imageUrl,
    );
  }

  // Метод для преобразования в Map
  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'type': characterType,
      'backstory': backstory,
      'image_url': imageUrl,
    };
  }
}