using System;
using System.Collections.Generic;
using System.Linq;
using EventsAppQuest.Web.Domain;

namespace EventsAppQuest.Web.Application
{
    /// <summary>
    /// Favoritos gerenciais, casos observados e fila pessoal de acompanhamento. Agregador: enriquece com dados da priorização quando disponível; não substitui priorização.
    /// </summary>
    public static class EventCycleWatchlistController
    {
        /// <summary>Adiciona um caso à watchlist.</summary>
        public static void AddToWatchlist(string cycleId, string opportunityId = null, string title = null, string watchReason = null)
        {
            WatchlistStore.Add(cycleId, opportunityId, title ?? ("Ciclo " + cycleId), watchReason);
        }

        /// <summary>Remove um caso da watchlist.</summary>
        public static void RemoveFromWatchlist(string cycleId)
        {
            WatchlistStore.Remove(cycleId);
        }

        /// <summary>Marca ou desmarca como favorito.</summary>
        public static void SetFavorite(string cycleId, bool isFavorite)
        {
            WatchlistStore.SetFavorite(cycleId, isFavorite);
        }

        /// <summary>Fixa ou desafixa o caso.</summary>
        public static void SetPinned(string cycleId, bool isPinned)
        {
            WatchlistStore.SetPinned(cycleId, isPinned);
        }

        /// <summary>Atualiza as notas do item observado.</summary>
        public static void UpdateNotes(string cycleId, string notes)
        {
            WatchlistStore.UpdateNotes(cycleId, notes);
        }

        /// <summary>Atualiza o motivo do acompanhamento.</summary>
        public static void UpdateWatchReason(string cycleId, string watchReason)
        {
            WatchlistStore.UpdateWatchReason(cycleId, watchReason);
        }

        /// <summary>Obtém o estado da watchlist; opcionalmente actualiza títulos a partir da priorização.</summary>
        public static EventCycleWatchlistState GetWatchlistState(EventCyclePortfolioPriorityState priorityState = null, DateTime? updatedAt = null)
        {
            var now = updatedAt ?? DateTime.UtcNow;
            var items = WatchlistStore.GetAll();

            if (priorityState?.Items != null)
            {
                foreach (var p in priorityState.Items)
                {
                    var w = items.FirstOrDefault(i => i.CycleId == p.CycleId);
                    if (w != null && !string.IsNullOrEmpty(p.Title))
                        w.Title = p.Title;
                }
            }

            var favorites = items.Where(i => i.IsFavorite).ToList();
            var pinned = items.Where(i => i.IsPinned).OrderByDescending(i => i.LastTouchedAt).ToList();
            var topPinned = pinned.FirstOrDefault();

            var summary = items.Count == 0
                ? "Nenhum caso observado."
                : $"{items.Count} observado(s) | {favorites.Count} favorito(s) | {pinned.Count} fixado(s).";

            return new EventCycleWatchlistState
            {
                Items = items,
                FavoriteItems = favorites,
                PinnedItems = pinned,
                TotalWatched = items.Count,
                WatchlistSummary = summary,
                TopPinnedItem = topPinned,
                LastUpdatedAt = now
            };
        }

        /// <summary>Indica se o ciclo está na watchlist.</summary>
        public static bool IsWatched(string cycleId) => WatchlistStore.IsWatched(cycleId);
    }
}
