import 'package:dio/dio.dart'; import 'package:pmu_labs/data/dtos/bosses_dto.dart'; import 'package:pmu_labs/data/mappers/bosses_mapper.dart'; import 'package:pmu_labs/domain/models/card_data.dart'; import 'package:pmu_labs/domain/models/home_data.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:html/parser.dart' as html; import 'api_interface.dart'; Map transformJsonToBossesDtoFormat( Map pages, List<(String, String)> descs) { final transformedData = pages.values.map((boss) { final title = boss['title'] as String; final imageUrl = boss['original']?['source'] as String? ?? ''; final description = descs.firstWhere((desc) => desc.$1 == title).$2; final id = boss['pageid'].toString(); return { 'title': title, 'imageUrl': imageUrl, 'description': description, 'id': id, }; }).toList(); // Формируем структуру, которая будет соответствовать BossesDto return { 'data': transformedData, }; } void removeByTitle(Map map, String title) { map.removeWhere((key, value) { return value is Map && value['title'] == title; }); } void getBySearch(Map map, String? title) { map.removeWhere((key, value) { return value is Map && value['title'] != title; }); } class BossesRepository extends ApiInterface { static final Dio _dio = Dio() ..interceptors.add(PrettyDioLogger( requestHeader: true, requestBody: true, )); static const String _baseUrl = 'https://sekiro.fandom.com/ru/api.php'; @override Future loadData({ OnErrorCallback? onError, String? q, }) async { try { String url = ''; if (q != null && q != "") { url = '$_baseUrl?action=query&titles=$q&prop=pageimages&piprop=original&format=json&origin=*'; } else { url = '$_baseUrl?action=query&generator=categorymembers&gcmtitle=Category:Боссы&gcmnamespace=0&gcmlimit=50&prop=pageimages&piprop=original&format=json&origin=*'; } final HomeData? data; BossesDto dto; final Response response = await _dio.get>(url); final pages = response.data['query']['pages'] as Map; removeByTitle(pages, 'Боссы'); List<(String, String)> descs = []; final Response respDesc = await _dio.get>( 'https://sekiro.fandom.com/ru/api.php?action=query&generator=categorymembers&gcmtitle=Category:Боссы&gcmnamespace=0&gcmlimit=50&prop=revisions&rvprop=content&format=json&origin=*'); for (var boss in pages.values) { final htmlContent = respDesc.data['query']['pages']['${boss['pageid']}']['revisions'][0]['*']; var document = html.parse(htmlContent); String text = document.body?.text ?? ''; text = text.split("==Галерея==")[0]; text = text.split("== Галерея ==")[0]; text = text.split("== Видео ==")[0]; text = text.replaceAll(RegExp(r'\{[^\}]*\}'), ''); text = text.replaceAll(RegExp(r'[{}]'), ''); descs.add((boss['title'], text.trim())); } final transData = transformJsonToBossesDtoFormat(pages, descs); dto = BossesDto.fromJson(transData); if (q != null && q != "") { getBySearch(pages, q); final transData = transformJsonToBossesDtoFormat(pages, descs); dto = BossesDto.fromJson(transData); } data = dto.toDomain(); return data; } on DioException catch (e) { onError?.call(e.error?.toString()); return null; } } }