using Edu.Model.Entity.Exam;
using Edu.Model.ViewModel.Exam;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using VT.FW.DB.Dapper;

namespace Edu.Repository.Exam
{
    /// <summary>
    /// 试卷仓储层
    /// </summary>
    public class RB_Examination_PaperRepository : BaseRepository<RB_Examination_Paper>
    {
        /// <summary>
        /// 获取试卷分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Paper_ViewModel> GetExaminationPaperPageRepository(int pageIndex, int pageSize, out long rowsCount, RB_Examination_Paper_ViewModel query)
        {
            string tempSql = string.Format(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.ParentId), 0);
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.*
FROM RB_Examination_Paper AS A
WHERE 1=1 
");
            builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.Status),(int)Common.Enum.DateStateEnum.Normal);
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.Group_Id), query.Group_Id);
                }
                if (query.PaperId > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.PaperId), query.PaperId);
                }
                else if (!string.IsNullOrEmpty(query.QPaperIds))
                {
                    builder.AppendFormat(@" AND A.{0} IN({1}) ", nameof(RB_Examination_Paper_ViewModel.PaperId), query.QPaperIds);
                }
                else
                {
                    if (!string.IsNullOrEmpty(query.QStartTime))
                    {
                        builder.AppendFormat(@" AND A.{0}>='{1}' ", nameof(RB_Examination_Paper_ViewModel.CreateTime), query.QStartTime);
                    }
                    if (!string.IsNullOrEmpty(query.QEndTime))
                    {
                        builder.AppendFormat(@" AND A.{0}<='{1} 23:59:59' ", nameof(RB_Examination_Paper_ViewModel.CreateTime), query.QEndTime);
                    }
                    if (!string.IsNullOrEmpty(query.PaperName))
                    {
                        builder.AppendFormat(" AND A.{0} LIKE @PaperName ", nameof(RB_Examination_Paper_ViewModel.PaperName));
                        parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                        tempSql = "";
                    }
                    if (query.ParentId > 0)
                    {
                        builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.ParentId), query.ParentId);
                        tempSql = "";
                    }
                    //没有权限的时候查询
                    if (query.CreateBy > 0)
                    {
                        builder.AppendFormat(@" AND 
                                (  
                                    (A.{0}={1}  {2} ) 
                                 OR (A.{0}<>{1} AND A.IsOpen=2 )
                                ) ", nameof(RB_Examination_Paper_ViewModel.CreateBy), query.CreateBy, (query.ParentId > 0 ? "" : " AND A.ParentId=0 "));
                        tempSql = "";
                    }
                    //查询条件中的创建人
                    if (query.QCreateBy > 0)
                    {
                        builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.CreateBy), query.QCreateBy);
                    }
                    if (query.QExamineStatus > -1)
                    {
                        tempSql = "";
                        //正常
                        if (query.QExamineStatus == 2)
                        {
                            builder.AppendFormat(@" AND A.{0} IN(2,5) AND A.PaperType=2 ", nameof(RB_Examination_Paper_ViewModel.ExamineStatus));
                        }
                        //驳回
                        else if (query.QExamineStatus == 3)
                        {
                            builder.AppendFormat(@" AND A.{0} IN(3,4) AND A.PaperType=2 ", nameof(RB_Examination_Paper_ViewModel.ExamineStatus));
                        }
                        else
                        {
                            builder.AppendFormat(@" AND A.{0}={1} AND A.PaperType=2 ", nameof(RB_Examination_Paper_ViewModel.ExamineStatus), query.QExamineStatus);
                        }
                    }
                    builder.AppendFormat(tempSql);
                }
            }
            builder.AppendFormat(" ORDER BY A.{0} ASC,A.{0} DESC,A.CreateTime DESC ", nameof(RB_Examination_Paper_ViewModel.PaperType),nameof(RB_Examination_Paper_ViewModel.PaperId));
            return GetPage<RB_Examination_Paper_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
        }

        /// <summary>
        /// 获取试卷列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Paper_ViewModel> GetExaminationPaperListRepository(RB_Examination_Paper_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.*
FROM RB_Examination_Paper AS A
WHERE 1=1 
");
            builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.Status), (int)Common.Enum.DateStateEnum.Normal);
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.Group_Id), query.Group_Id);
                }
                if (!string.IsNullOrEmpty(query.PaperName))
                {
                    builder.AppendFormat(" AND A.{0} LIKE @PaperName ", nameof(RB_Examination_Paper_ViewModel.PaperName));
                    parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                }
                if (query.ParentId > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.ParentId), query.ParentId);
                }
                if (query.PaperId > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.PaperId), query.PaperId);
                }
                if (!string.IsNullOrEmpty(query.QPaperIds))
                {
                    builder.AppendFormat(@" AND A.{0} IN({1}) ", nameof(RB_Examination_Paper_ViewModel.PaperId), query.QPaperIds);
                }
                //查询文件夹
                if (query.IsQueryFolder == 1)
                {
                    builder.AppendFormat(@" AND A.{0}=1 ", nameof(RB_Examination_Paper_ViewModel.PaperType));
                }
                if (query.CreateBy > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Examination_Paper_ViewModel.CreateBy), query.CreateBy);
                }
            }
            builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Examination_Paper_ViewModel.PaperId));
            return Get<RB_Examination_Paper_ViewModel>(builder.ToString(), parameters).ToList();
        }


        /// <summary>
        /// 获取试卷所有下级列表
        /// </summary>
        /// <param name="QPaperIds"></param>
        /// <returns></returns>
        public List<RB_Examination_Paper_ViewModel> GetExaminationPaperChildRepository(string QPaperIds)
        {
            var parameters = new DynamicParameters();
            string procName = "proc_getchildpaper";
            parameters.Add("QPaperIds", QPaperIds, direction: ParameterDirection.Input);
            return Get<RB_Examination_Paper_ViewModel>(procName, parameters, commandType: CommandType.StoredProcedure).ToList();
        }

        /// <summary>
        /// 获取当前节点的所有父级节点
        /// </summary>
        /// <param name="QPaperIds"></param>
        /// <returns></returns>
        public List<RB_Examination_Paper_ViewModel> GetExaminationPaperParentRepository(string QPaperIds)
        {
            var parameters = new DynamicParameters();
            string procName = "proc_getparentpaper";
            parameters.Add("QPaperIds", QPaperIds, direction: ParameterDirection.Input);
            return Get<RB_Examination_Paper_ViewModel>(procName, parameters, commandType: CommandType.StoredProcedure).ToList();
        }

        /// <summary>
        /// 修改试卷发布次数
        /// </summary>
        /// <param name="PaperId"></param>
        /// <returns></returns>
        public int UpdateExaminationPaperPublishCountRepository(int PaperId)
        {
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(" UPDATE RB_Examination_Paper SET PublishCount=PublishCount+1 WHERE PaperId={0} ", PaperId);
            return base.Execute(builder.ToString());
        }

        /// <summary>
        /// 批量修改试卷【开放/私有】状态
        /// </summary>
        /// <param name="paperIds"></param>
        /// <param name="IsOpen"></param>
        /// <returns></returns>

        public int BatchSetIsOpenRepository(List<int> paperIds, int IsOpen)
        {
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(" UPDATE RB_Examination_Paper SET IsOpen={0} WHERE PaperId IN({1}) ", IsOpen, string.Join(",", paperIds));
            return base.Execute(builder.ToString());
        }

        /// <summary>
        /// 批量移动文件夹
        /// </summary>
        /// <param name="ParentId"></param>
        /// <param name="paperIds"></param>
        /// <returns></returns>
        public int BatchMovePaperRepository(int ParentId, List<int> paperIds)
        {
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(" UPDATE RB_Examination_Paper SET ParentId={0} WHERE PaperId IN({1}) ", ParentId, string.Join(",", paperIds));
            return base.Execute(builder.ToString());
        }
    }
}