using Tiobon.Core.IServices;

namespace Tiobon.Core.Services;

/// <summary>
/// 【牛尾】培训计划 (服务)
/// </summary>
public class Ghre_UshioPlanServices : BaseServices<Ghre_UshioPlan, Ghre_UshioPlanDto, InsertGhre_UshioPlanInput, EditGhre_UshioPlanInput>, IGhre_UshioPlanServices
{
    private readonly IBaseRepository<Ghre_UshioPlan> _dal;
    private readonly ICommonServices _commonServices;
    public Ghre_UshioPlanServices(ICaching caching, IBaseRepository<Ghre_UshioPlan> dal, ICommonServices commonServices)
    {
        this._dal = dal;
        base.BaseDal = dal;
        base._caching = caching;
        _commonServices = commonServices;
    }


    public override async Task<ServicePageResult<Ghre_UshioPlanDto>> QueryFilterPage(QueryBody filter, string condition, bool? IsEnable = true)
    {

        var result = await base.QueryFilterPage(filter, condition, IsEnable);

        int? year = null;
        if (filter.jsonParam != null)
            foreach (JProperty jProperty in filter.jsonParam.Properties())
            {
                var name = jProperty.Name;
                var value = jProperty.Value.ToString();
                if (name == "Year")
                {

                    var jsonParam = JsonHelper.JsonToObj<JsonParam>(value);
                    year = jsonParam.columnValue.ObjToInt();

                }
            }

        var DT_TableDataT1 = result.result.DT_TableDataT1;

        var deptIds = DT_TableDataT1.Select(x => x.DeptId).Distinct().ToList();
        //var courseIds = DT_TableDataT1.Select(x => x.CourseId).Distinct().ToList();
        var staffIds = new List<int>();
        for (int i = 0; i < DT_TableDataT1.Count; i++)
        {
            if (DT_TableDataT1[i].StaffIds.IsNotEmptyOrNull())
                staffIds.AddRange(JsonHelper.JsonToObj<List<int>>(DT_TableDataT1[i].StaffIds));

            if (DT_TableDataT1[i].Month.IsNotEmptyOrNull())
                DT_TableDataT1[i].Months = JsonHelper.JsonToObj<List<string>>(DT_TableDataT1[i].Month);
            DT_TableDataT1[i].TrainCategory = await GetParaLabel("TrainingCategory", DT_TableDataT1[i].TrainCategory);
            DT_TableDataT1[i].Month = await GetParaLabel("MonthSelect", DT_TableDataT1[i].Month);
        }
        staffIds = staffIds.Distinct().ToList();
        var staffs = await Db.Queryable<Ghra_Staff>().Where(x => staffIds.Contains(x.StaffID)).ToListAsync();
        var depts = await Db.Queryable<Ghro_Dept>().Where(x => deptIds.Contains(x.DeptID)).ToListAsync();
        //var courses = await Db.Queryable<Ghre_Course>().Where(x => courseIds.Contains(x.Id)).ToListAsync();


        for (int i = 0; i < DT_TableDataT1.Count; i++)
        {
            DT_TableDataT1[i].InOrOut = await GetParaLabel("CourseInOrOut", DT_TableDataT1[i].InOrOut);
            if (DT_TableDataT1[i].StaffIds.IsNotEmptyOrNull())
            {
                var staffIds1 = JsonHelper.JsonToObj<List<int>>(DT_TableDataT1[i].StaffIds);
                if (staffIds1.Any())
                    DT_TableDataT1[i].StaffNames = string.Join("、", staffs.Where(x => staffIds1.Contains(x.StaffID)).Select(x => x.StaffName));
            }

            //DT_TableDataT1[i].CourseName = courses.Where(x => x.Id == DT_TableDataT1[i].CourseId).Select(x => x.CourseName).FirstOrDefault();
            DT_TableDataT1[i].DeptName = depts.Where(x => x.DeptID == DT_TableDataT1[i].DeptId).Select(x => x.DeptName).FirstOrDefault();


            if (DT_TableDataT1[i].TrainNum != null && DT_TableDataT1[i].TrainDays != null)
                DT_TableDataT1[i].TotalDays = DT_TableDataT1[i].TrainNum * DT_TableDataT1[i].TrainDays;

            if (DT_TableDataT1[i].Months.Any())
            {
                DT_TableDataT1[i].Months.ForEach(x =>
                {
                    //if (x.ObjToInt() == 1) DT_TableDataT1[i] = "✔√";
                    if (x.ObjToInt() == 1) DT_TableDataT1[i].M1 = "✔";
                    else if (x.ObjToInt() == 2) DT_TableDataT1[i].M2 = "✔";
                    else if (x.ObjToInt() == 3) DT_TableDataT1[i].M3 = "✔";
                    else if (x.ObjToInt() == 4) DT_TableDataT1[i].M4 = "✔";
                    else if (x.ObjToInt() == 5) DT_TableDataT1[i].M5 = "✔";
                    else if (x.ObjToInt() == 6) DT_TableDataT1[i].M6 = "✔";
                    else if (x.ObjToInt() == 7) DT_TableDataT1[i].M7 = "✔";
                    else if (x.ObjToInt() == 8) DT_TableDataT1[i].M8 = "✔";
                    else if (x.ObjToInt() == 9) DT_TableDataT1[i].M9 = "✔";
                    else if (x.ObjToInt() == 10) DT_TableDataT1[i].M10 = "✔";
                    else if (x.ObjToInt() == 11) DT_TableDataT1[i].M11 = "✔";
                    else if (x.ObjToInt() == 12) DT_TableDataT1[i].M12 = "✔";


                });
            }
        }


        ModuleParam param = new ModuleParam()
        {
            langId = filter.langId,
            menuName = filter.menuName
        };
        var module = await _commonServices.GetModuleInfoAsync(param);
        result.result.JM_TableColumnT1 = module.Data.JM_TableColumnT1;

        var yearField = module.Data.JM_TableColumnT1.TableColumn.Where(x => x.field == "Year").SingleOrDefault();
        if (year != yearField?.searchColumnDefaultValue.ObjToInt())
        {

            result.result.JM_TableColumnT1.TableColumn?.ForEach(x =>
            {
                if (x.GroupName == "预算编制数")
                {

                    int month = x.field.Replace("M", null).Replace("_F", null).ObjToInt();
                    x.label = year + "-" + (month < 10 ? "0" + month : month);
                    if (month == 12)
                        year++;
                }
            });
        }

        return result;
    }

    public override async Task<long> Add(InsertGhre_UshioPlanInput entity)
    {
        if (entity.StaffId != null)
            entity.StaffIds = JsonHelper.ObjToJson(entity.StaffId);
        if (entity.StaffId.IsNotEmptyOrNull() && entity.StaffId.Count > 0)
            entity.TrainNum = entity.StaffId.Count;
        if (entity.Months != null)
            entity.Month = JsonHelper.ObjToJson(entity.Months);
        var result = await base.Add(entity);

        return result;
    }

    public override async Task<bool> Update(long Id, EditGhre_UshioPlanInput editModel)
    {
        if (editModel.StaffId != null)
            editModel.StaffIds = JsonHelper.ObjToJson(editModel.StaffId);

        if (editModel.Months != null)
            editModel.Month = JsonHelper.ObjToJson(editModel.Months);
        if (editModel.StaffId.IsNotEmptyOrNull() && editModel.StaffId.Count > 0)
            editModel.TrainNum = editModel.StaffId.Count;
        var result = await base.Update(Id, editModel, null, ["Status"]);
        return result;
    }

    public override async Task<ServiceFormResult<Ghre_UshioPlanDto>> QueryForm(QueryForm body)
    {
        var result = await base.QueryForm(body);
        string StaffIds = result.result.DT_TableDataT1[0].StaffIds;
        string Month = result.result.DT_TableDataT1[0].Month;
        if (!string.IsNullOrWhiteSpace(StaffIds))
            result.result.DT_TableDataT1[0].StaffId = JsonConvert.DeserializeObject<List<int>>(StaffIds);

        if (!string.IsNullOrWhiteSpace(Month))
            result.result.DT_TableDataT1[0].Months = JsonConvert.DeserializeObject<List<string>>(Month);
        if (result.result.DT_TableDataT1[0].TrainNum != null && result.result.DT_TableDataT1[0].TrainDays != null)
            result.result.DT_TableDataT1[0].TotalDays = result.result.DT_TableDataT1[0].TrainNum * result.result.DT_TableDataT1[0].TrainDays;
        return result;
    }
    public async Task<ServiceResult<long>> InsertByStatus(InsertGhre_UshioPlanInput insertModel, string status)
    {

        if (insertModel.StaffId != null)
            insertModel.StaffIds = JsonHelper.ObjToJson(insertModel.StaffId);
        var data = ServiceResult<long>.OprateSuccess("新增成功", 0);
        insertModel.Status = status;
        var id = await Add(insertModel);

        data.Success = id > 0;
        if (data.Success)
            data.Data = id;
        else
            return ServiceResult<long>.OprateFailed("失败！");

        return data;
    }

    public async Task<ServiceResult> UpdateStatus(InsertGhre_UshioPlanInput input, string status)
    {

        HttpRequest request = UserContext.Context.Request;
        var api = request.Path.ObjToString().TrimEnd('/').ToLower();
        var ip = GetUserIp(UserContext.Context);

        var entities = new List<Ghre_UshioPlan>();
        foreach (var id in input.Ids)
        {
            if (!BaseDal.Any(id))
                continue;

            var entity = await BaseDal.QueryById(id);

            entity.UpdateIP = ip;
            entity.UpdateProg = api;
            entity.Status = status;
            entities.Add(entity);
        }

        var result = await BaseDal.Update(entities);
        return ServiceResult.OprateSuccess("执行成功！");

    }
}