using System;
using System.Collections.Generic;
using System.Threading.Tasks;

using Fab2ApprovalSystem.DMO;
using Fab2ApprovalSystem.Models;
using Fab2ApprovalSystem.Utilities;

using Quartz;

namespace Fab2ApprovalSystem.Workers;

public class OOOTrainingReportJob : IJob {

    private readonly UserAccountDMO userDMO = new();
    private readonly AdminDMO adminDMO = new();
    private readonly TrainingDMO trainingDMO = new();
    private readonly ECN_DMO ecnDMO = new();

    async Task IJob.Execute(IJobExecutionContext context) {
        await Task.Run(() => {
            string emailBody = "<h1>Mesa Approval Open Training Assignments Report - OOO</h1> <br />";
            emailBody += "<p>The following contains open training assignments in the Mesa Approval system for out of office users.";
            emailBody += " Please ensure they complete their training assignments promptly upon their return.</p><br />";
            emailBody += "<style>table,th,td{border: 1px solid black;}</style>";
            // Get all users set up to receive the training report email.
            List<TrainingReportUser> trainingReportUsers = adminDMO.GetTrainingReportUsers();
            List<string> emailList = new();
            foreach (TrainingReportUser user in trainingReportUsers) {
                string userEmail = userDMO.GetUserByID(user.UserId).Email;
                emailList.Add(userEmail);
            }
            // emailList.Add("Chase.Tucker@infineon.com");
            // Get a list of open trainings
            List<Training> openTrainings = trainingDMO.GetAllOpenTrainings();

            foreach (Training training in openTrainings) {
                string trainingSection = "";
                int trainingSectionUserCount = 0;
                string ecnTitle = ecnDMO.GetECN(training.ECN).Title;
                trainingSection += "<h3>" + training.ECN + " - " + ecnTitle + "</h3>";

                trainingSection += "<table>";
                trainingSection += "<tr><th>Name</th><th>Date Assigned</th></tr>";
                List<TrainingAssignment> openAssignments = trainingDMO.GetOpenAssignmentsByTrainingID(training.TrainingID);
                foreach (TrainingAssignment assignment in openAssignments) {
                    if (userDMO.GetUserByID(assignment.UserID).OOO) {
                        trainingSectionUserCount++;

                        DateTime? assignmentDate = assignment.DateAssigned;

                        string DateAssigned = assignmentDate.HasValue ? assignmentDate.Value.ToString("MM/dd/yyyy") : "<not available>";

                        trainingSection += "<tr><td>" + assignment.FullName + "</td><td>" + DateAssigned + "</td>";

                        trainingSection += "</tr>";
                    }
                }
                trainingSection += "</table>";
                if (trainingSectionUserCount > 0)
                    emailBody += trainingSection;
            }
            string recipientEmail = "";
            List<string> ccRecipients = emailList;
            EmailUtilities.SendNotification("MesaFabApproval@infineon.com", ccRecipients, "Open Training Report - OOO", emailBody);
        });
    }
}