using TaskStatus = ClaudeDo.Data.Models.TaskStatus;

namespace ClaudeDo.Worker.Tickets;

/// <summary>
/// Reine Abbildung Task-Status → Ticket-Status. Ticket-Status im Bandel-System:
/// 0 Keine, 1 Offen, 2 InBearbeitung, 3 Fertig, 4 Archiviert.
/// </summary>
public static class TicketStatusMap
{
    public const int InBearbeitung = 2;
    public const int Fertig = 3;

    private const string BandelPrefix = "bandel:";

    /// <summary>
    /// Zielstatus im Ticketsystem, oder null wenn dieser Task-Status nichts melden soll.
    /// "Offen" (1) wird nie geschrieben: das ist der Eingangszustand. Failed/Cancelled lassen
    /// das Ticket bewusst auf InBearbeitung stehen — die Arbeit ist angefangen, nicht zurückgegeben.
    /// </summary>
    public static int? ToTicketStatus(TaskStatus status) => status switch
    {
        TaskStatus.Running or TaskStatus.WaitingForReview => InBearbeitung,
        TaskStatus.Done => Fertig,
        _ => null,
    };

    /// <summary>Ticket-Id aus einem "bandel:&lt;id&gt;"-Ref, oder null bei jedem anderen Format.</summary>
    public static int? ParseBandelTicketId(string? ticketRef)
    {
        if (string.IsNullOrWhiteSpace(ticketRef)) return null;
        if (!ticketRef.StartsWith(BandelPrefix, StringComparison.OrdinalIgnoreCase)) return null;
        var raw = ticketRef[BandelPrefix.Length..];
        return int.TryParse(raw, out var id) && id > 0 ? id : null;
    }
}
