using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using BLL;
namespace WebAPI.Controllers
{
    /// 
    /// 会议接口
    /// 
    public class MeetingController : ApiController
    {
        #region 根据MeetingId获取会议详细信息
        /// 
        /// 根据MeetingId获取会议详细信息
        /// 
        /// 会议ID
        /// 会议类型(C-班前会;W-周例会;M-例会;S-专题例会;A-其他会议)
        /// 会议详细
        public Model.ResponeData getMeetingByMeetingId(string meetingId, string meetingType)
        {
            var responeData = new Model.ResponeData();
            try
            {
                responeData.data = APIMeetingService.getMeetingByMeetingId(meetingId, meetingType);
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 根据projectId\meetingType\states获取会议列表
        /// 
        /// 根据projectId、meetingType获取会议列表
        /// 
        /// 
        /// 会议类型(C-班前会;W-周例会;M-例会;S-专题例会;A-其他会议)
        /// 状态(0-待提交;1-已提交)
        /// 页码
        /// 
        public Model.ResponeData getMeetingByProjectIdStates(string projectId, string meetingType, string states, int pageIndex)
        {
            var responeData = new Model.ResponeData();
            try
            {
                List getDataList = new List();
                int pageCount = 0;
                if (meetingType == "C")
                {
                    pageCount = Funs.DB.Meeting_ClassMeeting.Count(x => x.ProjectId == projectId
                                   && (states == null || (states == "0" && (x.States == "0" || x.States == null)) || (states == "1" && (x.States == "1" || x.States == "2"))));
                }
                else if (meetingType == "W")
                {
                    pageCount = Funs.DB.Meeting_WeekMeeting.Count(x => x.ProjectId == projectId
                                    && (states == null || (states == "0" && (x.States == "0" || x.States == null)) || (states == "1" && (x.States == "1" || x.States == "2"))));
                }
                else if (meetingType == "M")
                {
                    pageCount = Funs.DB.Meeting_MonthMeeting.Count(x => x.ProjectId == projectId
                                       && (states == null || (states == "0" && (x.States == "0" || x.States == null)) || (states == "1" && (x.States == "1" || x.States == "2"))));
                }
                else if (meetingType == "S")
                {
                    pageCount = Funs.DB.Meeting_SpecialMeeting.Count(x => x.ProjectId == projectId
                                         && (states == null || (states == "0" && (x.States == "0" || x.States == null)) || (states == "1" && (x.States == "1" || x.States == "2"))));
                }
                else
                {
                    pageCount = Funs.DB.Meeting_AttendMeeting.Count(x => x.ProjectId == projectId
                                            && (states == null || (states == "0" && (x.States == "0" || x.States == null)) || (states == "1" && (x.States == "1" || x.States == "2"))));
                }
                if (pageCount > 0 && pageIndex > 0)
                {
                    getDataList = APIMeetingService.getMeetingByProjectIdStates(projectId, meetingType, states, pageIndex);
                }
                responeData.data = new { pageCount, getDataList };
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 根据ID删除会议
        [HttpDelete]
        public Model.ResponeData DeleteMeeting(string meetingId)
        {
            var responeData = new Model.ResponeData();
            try
            {
                BLL.ClassMeetingService.DeleteClassMeetingById(meetingId);
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 保存Meeting
        /// 
        /// 保存Meeting
        /// 
        /// 会议信息
        /// 
        [HttpPost]
        public Model.ResponeData SaveMeeting([FromBody] Model.MeetingItem meeting)
        {
            var responeData = new Model.ResponeData();
            try
            {
                APIMeetingService.SaveMeeting(meeting);
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 班前会参加人数统计
        public Model.ResponeData getClassMeetingPersonCount(string projectId, string meetingDate)
        {
            var responeData = new Model.ResponeData();
            try
            {
                
                // 1、获取项目用户(管理人员数量)
                string projectUserSQL = "SELECT * FROM [dbo].[Project_ProjectUser] as pu LEFT JOIN [dbo].[Sys_User] as u on u.UserId = pu.UserId WHERE pu.ProjectId = @ProjectId;";
                List listStr = new List();
                listStr.Add(new SqlParameter("@ProjectId", projectId));
                SqlParameter[] parameter = listStr.ToArray();
                DataTable userTb = SQLHelper.GetDataTableRunText(projectUserSQL, parameter);
                // 2、 获取班前会列表(日期过滤)
                List classMettingList = APIMeetingService.getClassMeetingList(projectId, meetingDate);
                int personCount = 0;
                classMettingList.ForEach(item =>
                {
                    personCount += item.AttentPersonNum;
                });
                responeData.data = new
                {
                    manager = userTb.Rows.Count,
                    personCount = personCount,
                    classMettingList = classMettingList
                };
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 公司级班前会人员统计
        public Model.ResponeData getCompanyMeetingPersonCounts( string meetingDate)
        {
            var responeData = new Model.ResponeData();
            try
            {
                using (Model.SGGLDB db = new Model.SGGLDB(Funs.ConnString))
                {
                    string sql = "SELECT p.ProjectId as projectId, p.ProjectName as projectName,(SELECT count(*) FROM [dbo].[Project_ProjectUser] as pu LEFT JOIN [dbo].[Sys_User] as u on u.UserId = pu.UserId WHERE pu.ProjectId = p.ProjectId) as manager,(SELECT SUM(AttentPersonNum) as cpunt FROM [dbo].[Meeting_ClassMeeting] as mc WHERE mc.ProjectId = p.ProjectId AND Year(ClassMeetingDate) = @year AND Month(ClassMeetingDate) = @month AND Day(ClassMeetingDate) = @day) as personCount FROM [dbo].[Base_Project] as p;";
                    DateTime mdate = Funs.GetNewDateTimeOrNow(meetingDate);
                    List listStr = new List();
                    listStr.Add(new SqlParameter("@year", mdate.Year));
                    listStr.Add(new SqlParameter("@month", mdate.Month));
                    listStr.Add(new SqlParameter("@day", mdate.Day));
                    SqlParameter[] parameter = listStr.ToArray();
                    DataTable tb = SQLHelper.GetDataTableRunText(sql, parameter);
                    responeData.data = tb;
                }
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
        #region 根据时间获取各单位班会情况
        /// 
        /// 根据时间获取各单位班会情况
        /// 
        /// 
        /// 单位ID
        /// 日期
        /// 页码
        /// 
        public Model.ResponeData getClassMeetingInfo(string projectId, string unitId, string meetingDate, int pageIndex)
        {
            var responeData = new Model.ResponeData();
            try
            {
                var getDataList = APIMeetingService.getClassMeetingInfo(projectId, unitId, meetingDate);
                int pageCount = getDataList.Count();
                if (pageCount > 0 && pageIndex > 0)
                {
                    getDataList = getDataList.Skip(Funs.PageSize * (pageIndex - 1)).Take(Funs.PageSize).ToList();
                }
                responeData.data = new { pageCount, getDataList };
            }
            catch (Exception ex)
            {
                responeData.code = 0;
                responeData.message = ex.Message;
            }
            return responeData;
        }
        #endregion
    }
}