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

namespace Edu.Repository.Exam
{
    /// <summary>
    /// 试卷发布仓储层
    /// </summary>
    public class RB_Examination_PublishRepository : BaseRepository<RB_Examination_Publish>
    {
        /// <summary>
        /// 获取发布试卷分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Publish_ViewModel> GetExaminationPublishPageRepository(int pageIndex, int pageSize, out long rowsCount, RB_Examination_Publish_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.*,IFNULL(B.PaperName,'') AS PaperName
FROM RB_Examination_Publish AS A LEFT JOIN rb_examination_paper AS B ON A.PaperId=B.PaperId
WHERE 1=1 
");
            builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Status), (int)DateStateEnum.Normal);
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Group_Id), query.Group_Id);
                }
                if (!string.IsNullOrEmpty(query.PaperName))
                {
                    builder.AppendFormat(" AND B.{0} LIKE @PaperName ", nameof(RB_Examination_Publish_ViewModel.PaperName));
                    parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                }
                if (query.CreateBy > 0)
                {
                    builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.CreateBy), query.CreateBy);
                }
                if (!string.IsNullOrEmpty(query.QStartTime))
                {
                    builder.AppendFormat(@" AND A.{0}>='{1}' ",nameof(RB_Examination_Publish_ViewModel.ExamStartTime),query.QStartTime);
                }
                if (!string.IsNullOrEmpty(query.QEndTime))
                {
                    builder.AppendFormat(@" AND A.{0}<='{1} 23:59:59' ", nameof(RB_Examination_Publish_ViewModel.ExamEndTime), query.QEndTime);
                }
                if (query.QTestStatus > 0)
                {
                    //未开始
                    if (query.QTestStatus == 1)
                    {
                        builder.AppendFormat(" AND A.{0}>'{1}' ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime), Common.ConvertHelper.FormatTime(DateTime.Now));
                    }
                    //进行中
                    if (query.QTestStatus == 2)
                    {
                        builder.AppendFormat(" AND A.{0}<='{1}' AND '{1}'<=A.{2} ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime)
                            ,Common.ConvertHelper.FormatTime(DateTime.Now)
                            ,nameof(RB_Examination_Publish_ViewModel.ExamEndTime)
                            );
                    }
                    //已结束
                    if (query.QTestStatus == 3)
                    {
                        builder.AppendFormat(" AND A.{0}<'{1}' ", nameof(RB_Examination_Publish_ViewModel.ExamEndTime), Common.ConvertHelper.FormatTime(DateTime.Now));
                    }
                }
            }
            builder.AppendFormat(" ORDER BY A.{0} DESC ", nameof(RB_Examination_Publish_ViewModel.Id));
            return GetPage<RB_Examination_Publish_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString(), parameters).ToList();
        }


        /// <summary>
        /// 获取发布试卷列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Publish_ViewModel> GetExaminationPublishListRepository(RB_Examination_Publish_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.*,IFNULL(B.PaperName,'') AS PaperName
FROM RB_Examination_Publish AS A LEFT JOIN rb_examination_paper AS B ON A.PaperId=B.PaperId
WHERE 1=1 
");
            builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Status), (int)DateStateEnum.Normal);
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Group_Id), query.Group_Id);
                }
                if (!string.IsNullOrEmpty(query.PaperName))
                {
                    builder.AppendFormat(" AND B.{0} LIKE @PaperName ", nameof(RB_Examination_Publish_ViewModel.PaperName));
                    parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                }
                if (!string.IsNullOrEmpty(query.QPublishIds))
                {
                    builder.AppendFormat(" AND A.{0} in ({1}) ", nameof(RB_Examination_Publish_ViewModel.Id), query.QPublishIds);
                }
                if (query.IsQNotNormal == 1)
                {
                    builder.AppendFormat(" AND A.ExamineStatus NOT IN(2,5,6) AND A.ExamEndTime<'{0}' ", Common.ConvertHelper.FormatTime(DateTime.Now));
                }
            }
            return Get<RB_Examination_Publish_ViewModel>(builder.ToString(), parameters).ToList();
        }

        /// <summary>
        /// 获取学生发布试卷分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Publish_ViewModel> GetGuestExaminationPublishPage(int pageIndex, int pageSize, out long rowsCount, RB_Examination_Publish_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.ExamStartTime,A.ExamEndTime,A.ExamineStatus,A.Id,A.PublishPic, C.PaperId,IFNULL(B.PaperName,'') AS PaperName,c.ExamStatus,C.Id AS Exam_Student_Id,C.GuestId 
FROM rb_examination_student AS C INNER JOIN RB_Examination_Publish AS A ON C.PublishId=A.Id
     INNER JOIN rb_examination_paper AS B ON C.PaperId=B.PaperId
		 LEFT JOIN rb_student_orderguest AS D ON C.GuestId=D.Id
WHERE 1=1  and  a.ExamineStatus=2 and b.ExamineStatus=2 
");
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Group_Id), query.Group_Id);
                }
                if (query.GuestId > 0)
                {
                    builder.AppendFormat(" AND c.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.GuestId), query.GuestId);
                }
                if (!string.IsNullOrEmpty(query.QAccountIds))
                {
                    builder.AppendFormat(" AND D.Account_Id IN({0}) ",  query.QAccountIds);
                }
                if (!string.IsNullOrEmpty(query.PaperName))
                {
                    builder.AppendFormat(" AND B.{0} LIKE @PaperName ", nameof(RB_Examination_Publish_ViewModel.PaperName));
                    parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                }
                if (query.ExamStatus > 0)
                {
                    if (query.ExamStatus == ExamTestStatusEnum.NotStarted)
                    {
                        builder.AppendFormat(" AND a.{0} > '{1}' ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.FinishStarted)
                    {
                        builder.AppendFormat(" AND a.{0} < '{1}' and a.{2} > '{1}' and c.{3}=1 ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nameof(RB_Examination_Publish_ViewModel.ExamEndTime), nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.MissedTest)
                    {
                        builder.AppendFormat(" AND a.{0} < '{1}' and c.{2} NOT IN(3,5) ", nameof(RB_Examination_Publish_ViewModel.ExamEndTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.FinishTest)
                    {
                        builder.AppendFormat(" AND c.{0} IN(3,5)", nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                }
            }
            builder.AppendFormat("  order by a.{0} desc ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime));
            return GetPage<RB_Examination_Publish_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
        }

        /// <summary>
        /// 获取学生的考试 + 得分 + 排名
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Examination_Publish_ViewModel> GetGuestExaminationPublishPage_V2(int pageIndex, int pageSize, out long rowsCount, RB_Examination_Publish_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.Id,A.ExamStartTime,A.ExamEndTime,A.ExamineStatus,A.PublishPic, 
C.PaperId,IFNULL(B.PaperName,'') AS PaperName,C.Id AS Exam_Student_Id,C.ExamStatus,
C.GuestId,C.TotalScore,CASE WHEN C.ExamEndTime IS NOT NULL THEN TIMESTAMPDIFF(SECOND,C.CreateTime,C.ExamEndTime) ELSE 0 END AS ExamSecondTime,
CASE WHEN C.TotalScore >0 THEN (SELECT COUNT(0) FROM rb_examination_student s2 WHERE s2.TotalScore > C.TotalScore and s2.PublishId = C.PublishId) +1 ELSE -1 END AS MyRank,
(SELECT MAX(TotalScore) FROM rb_examination_student s2 WHERE s2.PublishId = C.PublishId) AS MaxScore
FROM rb_examination_student AS C 
INNER JOIN RB_Examination_Publish AS A ON C.PublishId=A.Id
INNER JOIN rb_examination_paper AS B ON C.PaperId=B.PaperId
WHERE 1=1  and  A.ExamineStatus=2 and B.ExamineStatus=2 
");
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(" AND A.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.Group_Id), query.Group_Id);
                }
                if (query.GuestId > 0)
                {
                    builder.AppendFormat(" AND c.{0}={1} ", nameof(RB_Examination_Publish_ViewModel.GuestId), query.GuestId);
                }
                if (!string.IsNullOrEmpty(query.PaperName))
                {
                    builder.AppendFormat(" AND B.{0} LIKE @PaperName ", nameof(RB_Examination_Publish_ViewModel.PaperName));
                    parameters.Add("PaperName", "%" + query.PaperName.Trim() + "%");
                }
                if (query.ExamStatus > 0)
                {
                    if (query.ExamStatus == ExamTestStatusEnum.NotStarted)
                    {
                        builder.AppendFormat(" AND a.{0} > '{1}' ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.FinishStarted)
                    {
                        builder.AppendFormat(" AND a.{0} < '{1}' and a.{2} > '{1}' and c.{3}=1 ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nameof(RB_Examination_Publish_ViewModel.ExamEndTime), nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.MissedTest)
                    {
                        builder.AppendFormat(" AND a.{0} < '{1}' and c.{2} NOT IN(3,5) ", nameof(RB_Examination_Publish_ViewModel.ExamEndTime), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                    else if (query.ExamStatus == ExamTestStatusEnum.FinishTest)
                    {
                        builder.AppendFormat(" AND c.{0} IN(3,5)", nameof(RB_Examination_Publish_ViewModel.ExamStatus));
                    }
                }
            }
            builder.AppendFormat("  order by a.{0} desc ", nameof(RB_Examination_Publish_ViewModel.ExamStartTime));
            return GetPage<RB_Examination_Publish_ViewModel>(pageIndex, pageSize, out rowsCount, builder.ToString()).ToList();
        }
    }
}