using File_Folder_Helper.Models;
using File_Folder_Helper.Models.Exif;
using File_Folder_Helper.Models.Face;
using Microsoft.Extensions.Logging;
using System.Collections.ObjectModel;
using System.Text.Json;

namespace File_Folder_Helper.Helpers.Exif;

internal static class HelperExif
{

    private static ReadOnlyCollection<FaceFile> GetCollection(ExifDirectoryBase[]? exifDirectoryBases)
    {
        List<FaceFile> results = [];
        if (exifDirectoryBases is not null)
        {
            string? json;
            FaceFile[]? collection;
            foreach (ExifDirectoryBase exifDirectoryBase in exifDirectoryBases)
            {
                json = exifDirectoryBase.Artist;
                if (string.IsNullOrEmpty(json))
                    continue;
                collection = JsonSerializer.Deserialize(json, FaceFileCollectionGenerationContext.Default.FaceFileArray);
                if (collection is null)
                    continue;
                results.AddRange(collection);
            }
        }
        return new(results);
    }

    internal static void DragAndDrop(ILogger<Worker> logger, string argZero)
    {
        FileInfo fileInfo = new(argZero);
        logger.LogInformation("<{argZero}> exists", argZero);
        ExifDirectory exifDirectory = Exif.GetExifDirectory(fileInfo);
        string directory = Path.GetDirectoryName(argZero) ?? throw new Exception();
        string[] files = Directory.GetFiles(directory, "*.json", SearchOption.TopDirectoryOnly);
        string? json = files.Length != 1 ? string.Empty : File.ReadAllText(files[0]);
        ReadOnlyCollection<FaceFile> collection = GetCollection(exifDirectory.ExifBaseDirectories);
        logger.LogInformation("<{collection}> value", collection.Count);
        Dictionary<long, Person>? people = string.IsNullOrEmpty(json) ? [] : JsonSerializer.Deserialize(json, PeopleSourceGenerationContext.Default.DictionaryInt64Person) ?? throw new NullReferenceException();
        logger.LogInformation("<{people}> value", people?.Count);
        foreach (FaceFile faceFile in collection)
        {
            if (faceFile.MappingFromPerson is null)
                logger.LogInformation("<{Confidence}> value", faceFile.Location?.Confidence);
            else
                logger.LogInformation("<{DisplayDirectoryName}> value", faceFile.MappingFromPerson.DisplayDirectoryName);
        }
    }

}