using EventsAppQuest.Web.Producer.Core;
using EventsAppQuest.Web.Producer.Domain;

namespace EventsAppQuest.Web.Producer.Application
{
    /// <summary>
    /// Indicadores de conclusão operacional e relatório final: executado, com ajustes, com issues, relatório disponível, aguardando revisão do hotel.
    /// </summary>
    public static class FinalReportIndicatorHelper
    {
        /// <summary>Indicador principal para o estado de conclusão operacional do pedido.</summary>
        public static string GetFinalReportLabel(ProducerExecutionFinalReport report)
        {
            if (report == null) return "—";
            if (report.ClosedByProducerAt.HasValue && report.HotelAcknowledgedAt.HasValue)
                return "Concluído e reconhecido pelo hotel";
            if (report.ClosedByProducerAt.HasValue)
                return "Aguardando revisão final do hotel";
            if (report.GeneratedAt != default)
                return "Relatório final disponível";
            return "—";
        }

        /// <summary>Resumo curto: concluído limpo, com ajustes ou com issues.</summary>
        public static string GetCompletionSummaryLabel(ProducerExecutionFinalReport report)
        {
            if (report == null) return "—";
            if (!report.ClosedByProducerAt.HasValue)
                return "Não concluído operacionalmente";
            var hasIssues = (report.Items != null && report.Items.Exists(i => i.IsIssue && !i.IsResolved)) || !string.IsNullOrEmpty(report.BlockingIssuesEncountered);
            var hasAdjustments = (report.Items != null && report.Items.Exists(i => i.Category == ProducerExecutionReportItemCategory.Adjustment)) || !string.IsNullOrEmpty(report.AdjustmentsMade);
            if (hasIssues)
                return "Concluído com issues";
            if (hasAdjustments)
                return "Concluído com ajustes";
            return "Execução concluída";
        }

        /// <summary>Indicador para lista do produtor (relatório existe, concluído, aguardando hotel).</summary>
        public static string GetProducerIndicator(string orderId)
        {
            var report = FinalReportStore.GetReport(orderId);
            if (report == null) return "—";
            if (report.ClosedByProducerAt.HasValue && report.HotelAcknowledgedAt.HasValue)
                return "Fechado e reconhecido";
            if (report.ClosedByProducerAt.HasValue)
                return "Concluído (aguardar hotel)";
            return "Relatório final disponível";
        }

        /// <summary>Indicador para lista do hotel (relatório, concluído, reconhecido).</summary>
        public static string GetHotelIndicator(string orderId)
        {
            var report = FinalReportStore.GetReport(orderId);
            if (report == null) return "—";
            if (report.HotelAcknowledgedAt.HasValue)
                return "Revisão feita";
            if (report.ClosedByProducerAt.HasValue)
                return "Aguardando revisão final do hotel";
            return "Relatório final disponível";
        }
    }
}
