using TodoTicketApp.Models;

namespace TodoTicketApp.Services;

public class InMemoryTicketService : ITicketService
{
    // In-Memory Speicher. In einer echten App wäre das der DbContext.
    private readonly List<Ticket> _tickets = new();

    public void AddTicket(Ticket ticket)
    {
        _tickets.Add(ticket);
    }

    public IEnumerable<Ticket> GetPendingTickets()
    {
        // Hier ist deine Kernlogik: 
        // 1. Höchste Priorität zuerst (OrderByDescending)
        // 2. Bei gleicher Priorität: Älteste zuerst (ThenBy -> FIFO-Prinzip)
        return _tickets
            .Where(t => !t.IsCompleted)
            .OrderByDescending(t => t.Priority)
            .ThenBy(t => t.CreatedAt);
    }

    public Ticket? GetNextTicket()
    {
        // Holt genau das Ticket, das als nächstes bearbeitet werden muss
        return GetPendingTickets().FirstOrDefault();
    }

    public void CompleteTicket(Guid id)
    {
        var ticket = _tickets.FirstOrDefault(t => t.Id == id);
        if (ticket != null)
        {
            ticket.IsCompleted = true;
        }
    }

    public void AddComment(Guid ticketId, TicketComment comment)
    {
        var ticket = _tickets.FirstOrDefault(t => t.Id == ticketId);
        if (ticket != null)
        {
            ticket.Comments.Add(comment);
        }
    }
    public Ticket? GetTicketById(Guid id) => _tickets.FirstOrDefault(t => t.Id == id);

    public void UpdateTicket(Ticket ticket)
    {
        var existing = GetTicketById(ticket.Id);
        if (existing != null)
        {
            existing.Title = ticket.Title;
            existing.Description = ticket.Description;
            existing.Priority = ticket.Priority;
            existing.IsCompleted = ticket.IsCompleted;
            // In-Memory Update passiert hier automatisch durch Referenz, 
            // aber für DB-Logik wäre hier das Markieren als "Modified" nötig.
        }
    }
}