using ReportingServices.Shared.Models.ProductionReport;
using ReportingServices.Shared.ViewModels.ProductionReport;

namespace ReportingServices.Shared.HelperClasses
{
    public static class DailyReportHelper
    {
        private static readonly string _dailyRptFilePath = "wwwroot/Assets/DailyReportInfo.json";
        private static readonly string _SLLFilePath = "wwwroot/Assets/SLLTools.json";

        public static DailyReport SetUpDailyReport(string baseUrlFabtime, string baseUrlScrapeDb)
        {
            List<Task<List<EquipmentStateByDay>>> tasksEQState = new();
            List<Task<List<ToolStateCurrent>>> tasksState = new();
            DailyReport report = new()
            {
                SLLTools = JsonFileHandler.LoadJSONFile<List<SLLTool>>(_SLLFilePath),
                ManualReportEntries = JsonFileHandler.LoadJSONFile<ManualReportEntries>(_dailyRptFilePath)
            };

            Task<YieldInformation> task1 = ApiCaller.GetApi<YieldInformation>(baseUrlFabtime + "ReactorOuts?startDate=" + report.StartDate.ToString() + "&endDate=" + DateTime.Now.ToString());
            Task<YieldInformation> task2 = ApiCaller.GetApi<YieldInformation>(baseUrlFabtime + "ReactorOuts?startDate=" + report.StartDate.AddDays(-7).ToString() + "&endDate=" + report.StartDate.ToString());

            tasksEQState.Add(ApiCaller.GetApi<List<EquipmentStateByDay>>(baseUrlFabtime + "ToolStateTrend?toolType=ASM"));
            tasksEQState.Add(ApiCaller.GetApi<List<EquipmentStateByDay>>(baseUrlFabtime + "ToolStateTrend?toolType=EPP"));
            tasksEQState.Add(ApiCaller.GetApi<List<EquipmentStateByDay>>(baseUrlFabtime + "ToolStateTrend?toolType=HTR"));
            tasksState.Add(ApiCaller.GetApi<List<ToolStateCurrent>>(baseUrlFabtime + "ToolState?toolType=ASM"));
            tasksState.Add(ApiCaller.GetApi<List<ToolStateCurrent>>(baseUrlFabtime + "ToolState?toolType=EPP"));
            tasksState.Add(ApiCaller.GetApi<List<ToolStateCurrent>>(baseUrlFabtime + "ToolState?toolType=HTR"));
            tasksState.Add(ApiCaller.GetApi<List<ToolStateCurrent>>(baseUrlFabtime + "ToolState?toolType=Metrology"));
            tasksState.Add(ApiCaller.GetApi<List<ToolStateCurrent>>(baseUrlFabtime + "ToolState?toolType=Cleans"));

            Task<QuarterlyTargets> targets = ApiCaller.GetApi<QuarterlyTargets>(baseUrlScrapeDb + "Targets");
            Task<List<RDS>> rds = ApiCaller.GetApi<List<RDS>>(baseUrlScrapeDb + "RDS?date=" + report.StartDate.ToString());
            Task<List<Reactor>> reactors = ApiCaller.GetApi<List<Reactor>>(baseUrlScrapeDb + "Reactors");

            report.AddToolAvailibilityByType("ASM", tasksEQState[0].Result);
            report.AddToolAvailibilityByType("EPP", tasksEQState[1].Result);
            report.AddToolAvailibilityByType("HTR", tasksEQState[2].Result);

            report.AddToolStateByType("ASM", tasksState[0].Result);
            report.AddToolStateByType("EPP", tasksState[1].Result);
            report.AddToolStateByType("HTR", tasksState[2].Result);
            report.AddToolStateByType("Metrology", tasksState[3].Result);
            report.AddToolStateByType("Cleans", tasksState[4].Result);

            report.QuarterlyTargets = targets.Result;

            report.SetRDSInfo(rds.Result);
            report.SetReactorInfo(reactors.Result, GetUnscheduledReactors(report));

            report.CurrentWeek.SetYieldInformation(task1.Result, report.QuarterlyTargets);
            report.PreviousWeek.SetYieldInformation(task2.Result, report.QuarterlyTargets);

            report.ReverseLists();

            ManualReportEntries entries = report.ManualReportEntries;
            List<SLLTool> sll = report.SLLTools;

            JsonFileHandler.SaveJSONFile(entries, _dailyRptFilePath);
            JsonFileHandler.SaveJSONFile(sll, _SLLFilePath);

            return report;
        }

        public static List<int> GetUnscheduledReactors(DailyReport report)
        {
            List<int> reactors = new();

            foreach (KeyValuePair<string, ToolStateByType> keyValuePairs in report.ToolStateByType)
            {
                if (keyValuePairs.Key != "Metrology" && keyValuePairs.Key != "Cleans")
                {
                    foreach (ToolStateCurrent tool in keyValuePairs.Value.ToolStateCurrents)
                    {
                        if (tool.BasicStateDescription != "Productive" && tool.ReactorStatus != "Out of Service")
                        {
                            reactors.Add(int.Parse(tool.Tool.Substring(1)));
                        }
                    }
                }
            }

            return reactors;
        }
    }
}
