using System.Globalization;
using System.Text;

namespace GerbilManagerWebAPI.SaleAd
{
    /// <summary>
    /// FEAT-12a: assembles the German prompt for the sale-ad (Abgabe-Inserat)
    /// generation. Style and rules follow the breeder's real Jimdo listings
    /// (analysed in hive/agents/god/FEAT12-jimdo-publish-research.md):
    /// group-based listings, status line, bold emotive tagline, per-animal
    /// Farbschlag + "geboren am DD.MM.YYYY" + personality prose, NO PRICES.
    /// </summary>
    public static class SaleAdPromptBuilder
    {
        /// <summary>
        /// Two verbatim listings from kleine-chaoten.jimdofree.com (retrieved 2026-06-06).
        /// These are real listings in the breeder's own voice — the strongest grounding source.
        /// </summary>
        private const string ExampleListing1 = """
            Status: LOCKER RESERVIERT LEONIE

            „Großer und kleiner Bruder Dynamik” – Männliches Rennmaus Duo sucht ein liebevolles Zuhause

            Hier steht ein außergewöhnlich harmonisches Rennmaus-Duo zur Abgabe frei, das nicht nur durch seinen Charakter, sondern auch durch seine besondere Geschichte überzeugt. Die zwei verhalten sich als ob sie Brüder wären und sind unzertrennlich. Das Duo kann ab sofort ausziehen.

            Der Ältere von beiden trägt die Farbe CP-Agouti und ist am 11.11.2025 geboren. Er ist ein neugieriger, aktiver und sozialer kleiner Kerl. Er liebt es, seine Umgebung zu erkunden, ist gerne in Bewegung und bringt dabei eine angenehme Ausgeglichenheit mit. Er wirkt sicher, aufmerksam und zeigt ein rundum unkompliziertes Wesen.

            Sein, etwas jünger, Partner trägt die Farbe Schwarz Schecke und ist am 26.02.2026 geboren. Statt des in diesem Alter oft typischen Kräftemessens zeigt er ein erstaunlich sanftes, ruhiges und sehr soziales Verhalten. Man merkt ihm an, wie feinfühlig und verträglich er ist.
            """;

        private const string ExampleListing2 = """
            Status: FREI

            „Unzertrennliches Mutter-Tochter Duo sucht gemeinsam neue Körnergeber”

            Die Mama ist am 13.08.2025 geboren und trägt die Farbe Kohlfuchs. Sie ist eine eher ruhige und vorsichtige Rennmaus, die neuen Situationen zunächst aufmerksam begegnet. Gibt man ihr etwas Zeit, zeigt sich schnell ihre neugierige Seite und sie kommt gerne schauen, was im Gehege passiert. Sie ist ein echtes Energiebündel, liebt es zu buddeln, zu rennen und alles an Beschäftigungsmaterial – besonders Klorollen – kreativ umzugestalten. Charakterlich zeigt sie sich sehr sozial und friedlich; besonders hervorzuheben ist ihre fürsorgliche Art als Mutter.

            Die Tochter ist am 26.02.2026 geboren und trägt die Farbe Agouti-Schecke. Sie ist ihrer Mama sehr ähnlich, dabei aber schon ein kleines bisschen mutiger. Auch sie beobachtet erst gerne in Ruhe, bevor die Neugier siegt. Sie ist sehr anhänglich und orientiert sich stark an ihrer Mutter.

            Die zwei werden nur gemeinsam in ein rennmausgerechtes Zuhause abgegeben.
            """;

        /// <summary>System prompt: role, style description, hard rules, few-shot examples.</summary>
        public static string BuildSystemPrompt() => $"""
            Du schreibst Abgabe-Inserate für Mongolische Rennmäuse im Stil der „Zucht der kleinen Chaoten“.

            Stil und Aufbau (verbindlich):
            - Erste Zeile: die Status-Zeile, exakt wie vorgegeben (z. B. „Status: FREI“).
            - Danach eine fette, emotionale Überschrift (Tagline) in Anführungszeichen mit kurzem Untertitel, die den Charakter der Gruppe einfängt.
            - Danach pro Tier ein Absatz: Name – Farbschlag, geboren am TT.MM.JJJJ, gefolgt von warmherziger Persönlichkeits-Prosa auf Basis der mitgelieferten Notizen.
            - Abschluss: ein Satz, dass die Tiere nur gemeinsam in ein artgerechtes Zuhause abgegeben werden.

            Harte Regeln:
            - NIEMALS Preise oder Schutzgebühren nennen.
            - KEINE Fakten erfinden: Verwende ausschließlich die mitgelieferten Daten (Namen, Farbschläge, Geburtsdaten, Charakter-Angaben, Notizen). Fehlt eine Angabe, lässt du sie weg.
            - Charakter-Eigenschaften (Stichworte wie „zutraulich“, „buddelt gern“) und die Charakter-Notiz sind die Grundlage der Persönlichkeits-Prosa: Verwebe sie zu FLIESSENDEM Text — niemals als Aufzählung oder Stichwortliste ausgeben.
            - Sprache: Deutsch, warm und liebevoll, aber nicht kitschig-übertrieben.
            - Gib NUR den Inserat-Text aus — keine Erklärungen, keine Markdown-Code-Blöcke.

            Beispiel 1:
            {ExampleListing1}

            Beispiel 2:
            {ExampleListing2}
            """;

        /// <summary>User prompt: the actual group data + the user's free-text hints.</summary>
        public static string BuildUserPrompt(SaleAdRequest request)
        {
            var sb = new StringBuilder();
            sb.AppendLine("Erstelle ein Abgabe-Inserat für folgende Gruppe:");
            sb.AppendLine();
            sb.AppendLine($"Status-Zeile: {request.StatusLine}");
            sb.AppendLine();
            sb.AppendLine("Tiere:");
            foreach (var animal in request.Animals)
            {
                sb.Append($"- Name: {animal.Name}");
                if (!string.IsNullOrWhiteSpace(animal.Farbschlag))
                    sb.Append($" | Farbschlag: {animal.Farbschlag}");
                if (!string.IsNullOrWhiteSpace(animal.DateOfBirth))
                    sb.Append($" | geboren am {FormatGermanDate(animal.DateOfBirth)}");
                // FEAT-14c: Charakterbogen (Traits + Notiz) ist die BEVORZUGTE
                // Charakterquelle; die generischen Notizen dienen nur als
                // Fallback, wenn kein Charakterbogen gepflegt ist (sie enthalten
                // oft Verwaltungs-Infos, die nicht ins Inserat gehören).
                var hasCharacter = animal.Traits is { Count: > 0 }
                    || !string.IsNullOrWhiteSpace(animal.CharacterNote);
                if (animal.Traits is { Count: > 0 })
                    sb.Append($" | Charakter: {string.Join(", ", animal.Traits)}");
                if (!string.IsNullOrWhiteSpace(animal.CharacterNote))
                    sb.Append($" | Charakter-Notiz: {animal.CharacterNote}");
                if (!hasCharacter && !string.IsNullOrWhiteSpace(animal.Notes))
                    sb.Append($" | Notizen: {animal.Notes}");
                sb.AppendLine();
            }
            if (!string.IsNullOrWhiteSpace(request.Hints))
            {
                sb.AppendLine();
                sb.AppendLine($"Wünsche/Hinweise: {request.Hints}");
            }
            return sb.ToString();
        }

        /// <summary>ISO "YYYY-MM-DD" -> "TT.MM.JJJJ"; anything else passes through verbatim.</summary>
        internal static string FormatGermanDate(string isoDate) =>
            DateOnly.TryParseExact(isoDate, "yyyy-MM-dd", CultureInfo.InvariantCulture,
                DateTimeStyles.None, out var date)
                ? date.ToString("dd.MM.yyyy", CultureInfo.InvariantCulture)
                : isoDate;
    }
}
