using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Pf2e.Database.Model.Base.Targets;
namespace Pf2e.Scrapper.Importers.Implementations.Aonprd.Helpers;
///
/// Класс-помощник, хранящий необходимые глобальные данные.
///
public class AonprdBuilderGlobals
{
///
/// Цель внешних ссылок Архивов Нефисов.
///
public ExternalTarget AonprdTarget { get; set; } = null!;
///
/// Словарь идентификаторов источников.
///
public Dictionary SourceIds { get; } = [];
///
/// Словарь идентификаторов признаков.
///
public Dictionary TraitIds { get; } = [];
///
/// Список идентификаторов сущностей, которые нужно игнорировать при обработке.
///
public List Ignore { get; } = [];
///
/// Словарей суффиксов для сущностей
///
public Dictionary SlugSuffixes { get; } = [];
///
/// Словарь допольнительных проверок связей.
/// Ключ - устаревшая сущность, значение - обновлённая.
///
public Dictionary LegacyRemasterExtra { get; } = [];
///
/// Словарь сущностей, которые нужно слить с другой/другими.
/// Ключ - пропускаемая сущность. Значение - целевая сущность.
///
public Dictionary MergeSources { get; } = [];
///
/// Словарь сущностей, которые нужно слить с другой/другими.
/// Ключ - пропускаемая сущность. Значение - целевая сущность.
///
public Dictionary SubclassGroups { get; } = [];
///
/// Конструктор класса .
///
public AonprdBuilderGlobals()
{
using StreamReader fileReader = new("Resources\\ImportAdaptation.json");
JObject? json = JObject
.Parse(fileReader.ReadToEnd())
.SelectToken("Aonprd")
?.ToObject();
if (json is not null)
{
Ignore = json.SelectToken("Ignore")?.ToObject>() ?? [];
SlugSuffixes = JsonToDictionary(json, "SlugSuffixes");
LegacyRemasterExtra = JsonToDictionary(json, "LegacyRemasterExtra");
MergeSources = JsonToDictionary(json, "MergeSources");
SubclassGroups = JsonToDictionary(json, "SubclassGroups");
}
}
///
/// Получить суффикс для ссылки.
///
/// Идентификатор Aonprd.
/// Суффикс для ссылки или пустая строка.
public string GetSlugSuffix(string id)
{
return SlugSuffixes.TryGetValue(id, out string? slug) ? $"-{slug}" : string.Empty;
}
///
/// Преобразовать JSON-объект в словарь.
///
/// Исходный JSON-объект.
/// Путь к токену в JSON.
/// Результирующий словарь.
public static Dictionary JsonToDictionary(JObject json, string tokenPath)
{
return json.SelectToken(tokenPath)?.ToObject>() ?? [];
}
}
/*
Проверка уникальности:
SELECT
E.type,
E.slug,
COUNT(*),
string_agg(E.id::text, ', ' ORDER BY E.id),
string_agg(EE.external_id::text, ', ' ORDER BY E.id)
FROM public.entities AS E
INNER JOIN public.entity_externals AS EE ON EE.entity_id = E.id
GROUP BY E.type, E.slug
HAVING COUNT(*) > 1 AND E.type NOT IN ('rule', 'action')
*/