using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.IServices;
using APT.Infrastructure.Core;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using APT.Utility;
using APT.Infrastructure.Api;
using APT.Migrations;
using APT.BaseData.Domain.Entities.OP;
using APT.BaseData.Domain.Enums.OP;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.OP;
using APT.BaseData.Domain.Enums.PF;
namespace APT.PF.WebApiControllers.Api.PF
{
    /// 
    /// 通知
    /// 
    [Route("api/PF/PFNotice")]
    public class PFNoticeController : AuthorizeApiController
    {
        IOPTenantDBConnService ConnService { get; set; }
        /// 
        /// 
        /// 
        /// 
        public PFNoticeController(IOPTenantDBConnService connService)
        {
            ConnService = connService;
        }
        /// 
        /// 更新或新增数据
        /// 
        /// 对象实体
        /// 
        [HttpPost, Route("FullUpdate")]
        public JsonActionResult FullUpdate([FromBody] T_PF_NOTICE entity)
        {
            return SafeExecute(() =>
            {
                //如果是总部 同步修改 子公司
                var Files = entity.Nav_Files;
                entity.Nav_Files = null;
                entity.CREATER_ID = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
                if (entity.CREATER_ID.HasValue)
                {
                    var userLogin = GetEntity(entity.CREATER_ID.Value, "Nav_Department");
                    entity.CREATE_NAME = userLogin.NAME;//冗余赋值 给查看
                    entity.DEPARTMENT_ID = userLogin.DEPARTMENT_ID;
                    entity.CREATE_DEPARTMENT = userLogin.Nav_Department?.NAME;//冗余赋值 给子公司查看
                }
                this.UnifiedCommit(() =>
                {
                    UpdateEntityNoCommit(entity);
                    if (Files != null && Files.Any())
                        BantchSaveEntityNoCommit(Files);
                });
                try
                {
                    if (entity.ISTOCHILE && entity.STATUS == PFStandardStatus.Archived)
                    {
                        IEnumerable IlistImgs = null;
                        List listFile = null;
                        if (Files != null && Files.Count() > 0)
                        {
                            var listIMGIDS = Files.Select(e => e.IMG_FILE_ID);
                            IlistImgs = GetEntities(e => listIMGIDS.Contains(e.ID), null, "Nav_File");
                            listFile = new List();
                            foreach (var item in IlistImgs)
                            {
                                listFile.Add(item.Nav_File);
                                item.Nav_File = null;
                            }
                        }
                        Dictionary dicORGCONN = ConnService.GetConnDictionary(entity.ORG_ID);
                        entity.DEPARTMENT_ID = null; //组织清空  子公司不会有对应的ID   或者改为公司ID?
                        foreach (var itemConn in dicORGCONN)
                        {
                            using (var context = new MigrationContext(itemConn.Value))
                            {
                                entity.ISHEAD = true;
                                entity.ORG_ID = itemConn.Key;
                                if (Files != null && Files.Any())
                                {
                                    foreach (var item in Files)
                                    {
                                        item.ORG_ID = itemConn.Key;
                                    }
                                    foreach (var item in IlistImgs)
                                    {
                                        item.ORG_ID = itemConn.Key;
                                    }
                                    foreach (var item in listFile)
                                    {
                                        item.ORG_ID = itemConn.Key;
                                    }
                                }
                                try
                                {
                                    context.AddEntity(entity);
                                    if (Files != null && Files.Any())
                                    {
                                        context.AddEntities(Files);
                                        context.AddEntities(IlistImgs);
                                        context.AddEntities(listFile);
                                    }
                                    context.SaveChanges();
                                }
                                catch (Exception ex)
                                {
                                    context.Update(entity);
                                    if (Files != null && Files.Any())
                                    {
                                        context.UpdateEntities(Files);
                                        context.UpdateEntities(IlistImgs);
                                        context.UpdateEntities(listFile);
                                    }
                                }
                            }
                        }
                    }
                }
                catch { }
                return true;
            });
        }
    }
}