using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using API.DTOs.CoverDb;
using API.Entities;
using API.Entities.Person;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
namespace API.Data.Repositories;
#nullable enable
/// 
/// This is a manual repository, not a DB repo
/// 
public class CoverDbRepository
{
    private readonly List _authors;
    public CoverDbRepository(string filePath)
    {
        var deserializer = new DeserializerBuilder()
            .WithNamingConvention(CamelCaseNamingConvention.Instance)
            .Build();
        // Read and deserialize YAML file
        var yamlContent = File.ReadAllText(filePath);
        var peopleData = deserializer.Deserialize(yamlContent);
        _authors = peopleData.People;
    }
    public CoverDbAuthor? FindAuthorByNameOrAlias(string name)
    {
        return _authors.Find(author =>
            author.Name.Equals(name, StringComparison.OrdinalIgnoreCase) ||
            author.Aliases.Contains(name, StringComparer.OrdinalIgnoreCase));
    }
    public CoverDbAuthor? FindBestAuthorMatch(Person person)
    {
        var aniListId = person.AniListId > 0 ? $"{person.AniListId}" : string.Empty;
        var highestScore = 0;
        CoverDbAuthor? bestMatch = null;
        foreach (var author in _authors)
        {
            var score = 0;
            // Check metadata IDs and add points if they match
            if (!string.IsNullOrEmpty(author.Ids.AmazonId) && author.Ids.AmazonId == person.Asin)
            {
                score += 10;
            }
            if (!string.IsNullOrEmpty(author.Ids.AnilistId) && author.Ids.AnilistId == aniListId)
            {
                score += 10;
            }
            if (!string.IsNullOrEmpty(author.Ids.HardcoverId) && author.Ids.HardcoverId == person.HardcoverId)
            {
                score += 10;
            }
            // Check for exact name match
            if (author.Name.Equals(person.Name, StringComparison.OrdinalIgnoreCase))
            {
                score += 7;
            }
            // Check for alias match
            if (author.Aliases.Contains(person.Name, StringComparer.OrdinalIgnoreCase))
            {
                score += 5;
            }
            // Update the best match if current score is higher
            if (score <= highestScore) continue;
            highestScore = score;
            bestMatch = author;
        }
        return bestMatch;
    }
}