using System;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Data.Linq;
using System.Web.Security;
using System.Web.UI.WebControls;
using Model;
using BLL;
using System.Collections.Generic;

namespace BLL
{
    public class UnitProjectService
    {
        /// <summary>
        /// 根据单位/子单位工程Id获取单位/子单位工程信息
        /// </summary>
        /// <param name="unitProjectId">单位/子单位工程Id</param>
        /// <returns></returns>
        public static Model.Wbs_UnitProject GetUnitProjectByUnitProjectId(string unitProjectId)
        {
            return Funs.DB.Wbs_UnitProject.FirstOrDefault(e => e.UnitProjectId == unitProjectId);
        }

        /// <summary>
        /// 根据单位工程Id获取子单位工程集合信息
        /// </summary>
        /// <param name="unitProjectId">单位工程Id</param>
        /// <returns></returns>
        public static List<Model.Wbs_UnitProject> GetUnitProjectsBySuperUnitProjectId(string superUnitProjectId)
        {
            return (from x in Funs.DB.Wbs_UnitProject where x.SuperUnitProjectId == superUnitProjectId orderby x.UnitProjectCode select x).ToList();
        }

        /// <summary>
        /// 根据装置Id获取单位工程集合信息
        /// </summary>
        /// <param name="unitProjectId">单位工程Id</param>
        /// <returns></returns>
        public static List<Model.Wbs_UnitProject> GetUnitProjectsByInstallationId(string installationId)
        {
            return (from x in Funs.DB.Wbs_UnitProject where x.InstallationId == installationId && x.SuperUnitProjectId == null orderby x.UnitProjectCode select x).ToList();
        }

        /// <summary>
        /// 根据专业Id获取单位工程集合信息
        /// </summary>
        /// <param name="cnProfessionId">专业Id</param>
        /// <returns></returns>
        public static List<Model.Wbs_UnitProject> GetUnitProjectsByCnProfessionId(string cnProfessionId)
        {
            return (from x in Funs.DB.Wbs_UnitProject where x.CnProfessionId == cnProfessionId orderby x.UnitProjectCode select x).ToList();
        }

        /// <summary>
        /// 根据单位工程Id获取单位工程子级集合的累计工程量
        /// </summary>
        /// <param name="unitProjectId">单位工程Id</param>
        /// <returns></returns>
        public static decimal GetChildEngineerQuantitys(string unitProjectId)
        {
            return (from x in Funs.DB.Wbs_WbsSet where x.UnitProjectId == unitProjectId && x.SuperWbsSetId == null && x.IsApprove == true select x.EngineerQuantity ?? 0).Sum();
        }

        /// <summary>
        /// 增加单位工程/子单位工程
        /// </summary>
        /// <param name="user">单位工程/子单位工程</param>
        public static void AddUnitProject(Model.Wbs_UnitProject unitProject)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Wbs_UnitProject newUP = new Model.Wbs_UnitProject();
            newUP.UnitProjectId = unitProject.UnitProjectId;
            newUP.UnitProjectName = unitProject.UnitProjectName;
            newUP.UnitProjectCode = unitProject.UnitProjectCode;
            newUP.SuperUnitProjectId = unitProject.SuperUnitProjectId;
            newUP.InstallationId = unitProject.InstallationId;
            newUP.ProjectId = unitProject.ProjectId;
            newUP.CnProfessionId = unitProject.CnProfessionId;
            newUP.StartDate = unitProject.StartDate;
            newUP.EndDate = unitProject.EndDate;
            newUP.Weights = unitProject.Weights;
            newUP.Remark = unitProject.Remark;
            newUP.IsIn = unitProject.IsIn;
            newUP.IsSelected = unitProject.IsSelected;
            newUP.IsApprove = unitProject.IsApprove;
            newUP.SortIndex = unitProject.SortIndex;
            newUP.EngineerQuantity = unitProject.EngineerQuantity;
            newUP.BudgetUnitPrice = unitProject.BudgetUnitPrice;
            newUP.CostUnivalent = unitProject.CostUnivalent;
            newUP.Unit = unitProject.Unit;

            db.Wbs_UnitProject.InsertOnSubmit(newUP);
            db.SubmitChanges();
        }

        /// <summary>
        /// 修改单位工程/子单位工程
        /// </summary>
        /// <param name="user">单位工程/子单位工程</param>
        public static void UpdateUnitProject(Model.Wbs_UnitProject unitProject)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Wbs_UnitProject newUP = db.Wbs_UnitProject.First(e => e.UnitProjectId == unitProject.UnitProjectId);

            newUP.UnitProjectName = unitProject.UnitProjectName;
            newUP.UnitProjectCode = unitProject.UnitProjectCode;
            newUP.InstallationId = unitProject.InstallationId;
            newUP.StartDate = unitProject.StartDate;
            newUP.EndDate = unitProject.EndDate;
            newUP.Weights = unitProject.Weights;
            newUP.WeightsMoney = unitProject.WeightsMoney;
            newUP.Remark = unitProject.Remark;
            newUP.IsSelected = unitProject.IsSelected;
            newUP.IsApprove = unitProject.IsApprove;
            newUP.IsWeightsApprove = unitProject.IsWeightsApprove;
            newUP.SortIndex = unitProject.SortIndex;
            newUP.EngineerQuantity = unitProject.EngineerQuantity;
            newUP.BudgetUnitPrice = unitProject.BudgetUnitPrice;
            newUP.CostUnivalent = unitProject.CostUnivalent;
            newUP.Unit = unitProject.Unit;
            db.SubmitChanges();
        }

        /// <summary>
        /// 根据Id删除单位工程/子单位工程信息
        /// </summary>
        /// <param name="userId"></param>
        public static void DeleteUnitProject(string unitProjectId)
        {
            Model.SGGLDB db = Funs.DB;
            Model.Wbs_UnitProject UP = db.Wbs_UnitProject.First(e => e.UnitProjectId == unitProjectId);
            db.Wbs_UnitProject.DeleteOnSubmit(UP);
            db.SubmitChanges();
        }

        /// <summary>
        /// 根据Id删除所有子级单位工程/子单位工程信息
        /// </summary>
        /// <param name="userId"></param>
        public static void DeleteUnitProjectBySuperUnitProjectId(string superUnitProjectId)
        {
            Model.SGGLDB db = Funs.DB;
            var q = from x in db.Wbs_UnitProject where x.SuperUnitProjectId == superUnitProjectId select x;
            db.Wbs_UnitProject.DeleteAllOnSubmit(q);
            db.SubmitChanges();
        }
    }
}