using System.Text.Json.Serialization;

namespace GerbilManagerWebAPI.Import
{
    // ---- Source shapes (tools/import/output JSON, produced by extract.py) ----

    public sealed class SourceAnimal
    {
        public string Id { get; set; } = "";
        public string Name { get; set; } = "";
        public List<string> NameVariants { get; set; } = new();
        public string Dob { get; set; } = "";
        public string Death { get; set; } = "";
        public string? Gender { get; set; }
        public string Farbschlag { get; set; } = "";
        public List<string> FarbschlagVariants { get; set; } = new();
        public SourceGenotype Genotype { get; set; } = new();
        public string Zucht { get; set; } = "";
        public List<SourceParentRef> ParentRefs { get; set; } = new();
        public List<string> Photos { get; set; } = new();
        public List<string> SourceFiles { get; set; } = new();
        public bool Conflict { get; set; }
        public SourceLitterRef? LitterRef { get; set; }
    }

    public sealed class SourceGenotype
    {
        public Dictionary<string, List<string>> Mapped8locus { get; set; } = new();
        public string RawGenotype { get; set; } = "";
        public List<string> UnmappedTokens { get; set; } = new();
    }

    public sealed class SourceParentRef
    {
        public string Name { get; set; } = "";
        public string Dob { get; set; } = "";
        public string RoleGuess { get; set; } = "";
    }

    public sealed class SourceLitterRef
    {
        public string LitterId { get; set; } = "";
        public string Method { get; set; } = "";
        public string Confidence { get; set; } = "";       // "hoch" | "niedrig" | (ambiguous => candidates)
        public List<string>? Candidates { get; set; }
    }

    public sealed class SourceLitter
    {
        public string Id { get; set; } = "";
        public string LitterId { get; set; } = "";
        public string Date { get; set; } = "";
        public string DamName { get; set; } = "";
        public string SireName { get; set; } = "";
        public int? TotalBorn { get; set; }
        public string Zuchtnummer { get; set; } = "";
        public string Note { get; set; } = "";
        public List<string> Warnings { get; set; } = new();
    }

    // ---- Report shapes (Julian-readable: counts per category + samples) ----

    public sealed record ImportReport(
        bool Executed,
        LitterSummary Litters,
        AnimalSummary Animals,
        PhotoSummary Photos,
        IReadOnlyList<string> Samples,
        IReadOnlyList<string> Notes);

    public sealed record LitterSummary(int InSource, int Created, int AlreadyImported);

    public sealed record AnimalSummary(
        int InSource,
        int Created,
        int LinkedToLitter,
        int FarbschlagMatched,
        int FarbschlagUnmatched,
        int AlreadyImported,
        QuarantineSummary Quarantined);

    public sealed record QuarantineSummary(
        int Conflicts,
        int Stubs,
        int DateOnlyLinks,
        int AmbiguousLinks,
        int Total);

    public sealed record PhotoSummary(int Attached, int SourceFilesMissing);
}
