using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EMIS.ViewModel.SystemView;
using EMIS.ViewModel.UniversityManage.TeacherManage;
using EMIS.Entities;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using EMIS.ViewModel.CacheManage;

namespace EMIS.ViewModel.SelectCourse
{
    public class OptionalCourseSettingView
    {   
        /// <summary>
        /// 任选设定ID
        /// </summary>
        public System.Guid? OptionalCourseID { get; set; }

        /// <summary>
        /// 限选计划ID
        /// </summary>
        public Guid? ExecutableOptionalCourseID { get; set; }

        /// <summary>
        /// 选课编号
        /// </summary>
        [DisplayName("选课编号")]
        public string No { get; set; }

        /// <summary>
        /// 学年学期ID
        /// </summary>
        [Required]
        [DisplayName("学年学期ID")]
        public Guid? SchoolyearID { get; set; }

        /// <summary>
        /// 学年学期
        /// </summary>
        public string SchoolyearDesc { get; set; }

        /// <summary>
        /// 学年学期
        /// </summary>
        [DisplayName("学年学期")]
        public string SchoolYearCode { get; set; }

        /// <summary>
        /// 学年(学年学期对应学年)
        /// </summary>
        [DisplayName("学年")]
        public int? YearID { get; set; }

        /// <summary>
        /// 学年
        /// </summary>
        [DisplayName("学年")]
        public int? Years { get; set; }

        [DisplayName("入学学年学期")]
        public string GSchoolYearCode { get; set; }

        /// <summary>
        /// 校区ID
        /// </summary>
        [Display(ResourceType = typeof(EMIS.Resources.DataAnnotations.Label), Name = "CampusID")]
        public Nullable<System.Guid> CampusID { get; set; }

        /// <summary>
        /// 院系所ID
        /// </summary>
        [Display(ResourceType = typeof(EMIS.Resources.DataAnnotations.Label), Name = "CollegeID")]
        public Nullable<System.Guid> CollegeID { get; set; }

        /// <summary>
        /// 院系所
        /// </summary>
        [Display(ResourceType = typeof(EMIS.Resources.DataAnnotations.Label), Name = "College")]
        public string CollegeName { get; set; }

        /// <summary>
        /// 开课教研室
        /// </summary>
        [DisplayName("开课教研室")]
        [Required]
        public Guid? DepartmentID { get; set; }

        /// <summary>
        /// 开课教研室
        /// </summary>
        [DisplayName("开课教研室")]
        public string DepartmentName { get; set; }

        /// <summary>
        /// 年级专业
        /// </summary>
        [Required]
        [DisplayName("年级专业")]
        public Guid? GrademajorID { get; set; }

        /// <summary>
        /// 年级专业代码
        /// </summary>
        [DisplayName("年级专业代码")]
        public string GrademajorCode { get; set; }

        /// <summary>
        /// 年级专业名称
        /// </summary>
        [DisplayName("年级专业名称")]
        public string GrademajorName { get; set; }

        /// <summary>
        /// 年级(年级专业对应的年级)
        /// </summary>
        [DisplayName("年级")]
        public int? GradeID { get; set; }

        /// <summary>
        /// 年级(年级专业对应的年级)
        /// </summary>
        [DisplayName("年级")]
        public string Grade
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_Grade.ToString()).Where(x => x.Value == GradeID).Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 班级信息ID
        /// </summary>
        [DisplayName("班级信息ID")]
        [Required]
        public Guid? ClassmajorID { get; set; }

        /// <summary>
        /// 选修任务班名称
        /// </summary>
        [DisplayName("选修任务班名称")]
        public string DefaultClassName { get; set; }

        /// <summary>
        /// 专业课程ID
        /// </summary>
        [DisplayName("专业课程ID")]
        public Nullable<System.Guid> SpecialtyCourseID { get; set; }

        /// <summary>
        /// 专业信息ID
        /// </summary>
        [DisplayName("专业信息ID")]
        public Nullable<System.Guid> SpecialtyID { get; set; }

        /// <summary>
        /// 院系专业
        /// </summary>
        [Required]
        public int? StandardID { get; set; }

        /// <summary>
        /// 专业代码
        /// </summary>
        [DisplayName("专业代码")]
        public string StandardCode
        {
            get
            {
                var inistStandardCode = IdNameExt.GetDictionaryItem(DictionaryItem.CF_Standard.ToString())
                    .Where(x => x.Value == StandardID)
                    .Select(x => x.Code).FirstOrDefault();
                return (inistStandardCode != null ? inistStandardCode.PadLeft(6, '0') : "");
            }
        }

        /// <summary>
        /// 专业名称
        /// </summary>
        [DisplayName("专业名称")]
        public string StandardDesc
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_Standard.ToString())
                    .Where(x => x.Value == StandardID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 课程信息ID
        /// </summary>
        [Required]
        public Guid? CoursematerialID { get; set; }

        /// <summary>
        /// 课程代码
        /// </summary>
        [DisplayName("课程代码")]
        public string CourseCode { get; set; }

        /// <summary>
        /// 课程名称
        /// </summary>
        [DisplayName("课程名称")]
        public string CourseName { get; set; }

        /// <summary>
        /// 课程类型
        /// </summary>
        [Required]
        [DisplayName("课程类型")]
        public int? CourseTypeID { get; set; }

        /// <summary>
        /// 课程类型
        /// </summary>
        [DisplayName("课程类型")]
        public string CourseTypeName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_CourseType.ToString())
                    .Where(x => x.Value == CourseTypeID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 课程结构
        /// </summary>
        //[Required]
        [DisplayName("课程结构")]
        public int? CourseStructureID { get; set; }

        /// <summary>
        /// 课程结构
        /// </summary>
        [DisplayName("课程结构")]
        public string CourseStructureName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_CourseStructure.ToString())
                    .Where(x => x.Value == CourseStructureID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 课程属性
        /// </summary>
        //[Required]
        [DisplayName("课程属性")]
        public int? CourseCategoryID { get; set; }

        /// <summary>
        /// 课程属性
        /// </summary>
        [DisplayName("课程属性")]
        public string CourseCategoryName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_CourseCategory.ToString())
                    .Where(x => x.Value == CourseCategoryID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 课程性质
        /// </summary>
        //[Required]
        [DisplayName("课程性质")]
        public int? CourseQualityID { get; set; }

        /// <summary>
        /// 课程性质
        /// </summary>
        [DisplayName("课程性质")]
        public string CourseQualityName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_CourseQuality.ToString())
                    .Where(x => x.Value == CourseQualityID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 授课语言
        /// </summary>
        [DisplayName("授课语言")]
        public int? TeachinglanguageID { get; set; }

        /// <summary>
        /// 授课语言
        /// </summary>
        [DisplayName("授课语言")]
        public string TeachinglanguageName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_Teachinglanguage.ToString())
                    .Where(x => x.Value == TeachinglanguageID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 是否学位或主干课
        /// </summary>
        [DisplayName("是否学位或主干课")]
        public bool IsMainCourse { get; set; }

        /// <summary>
        /// 是否学位或主干课
        /// </summary>
        [DisplayName("是否学位或主干课")]
        public string IsMainCourseName
        { get { return this.IsMainCourse == true ? "是" : "否"; } }

        /// <summary>
        /// 开课学年
        /// </summary>
        [DisplayName("开课学年")]
        public int? Schoolyear { get; set; }

        /// <summary>
        /// 开课学年
        /// </summary>
        [DisplayName("开课学年")]
        public int? SchoolyearNumID { get; set; }

        /// <summary>
        /// 开课学年
        /// </summary>
        [DisplayName("开课学年")]
        public string SchoolyearNumName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_SchoolyearNum.ToString())
                    .Where(x => x.Value == SchoolyearNumID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 学期
        /// </summary>
        [DisplayName("学期")]
        public int? SchoolcodeID { get; set; }

        /// <summary>
        /// 学期
        /// </summary>
        [DisplayName("学期")]
        public string SchoolcodeName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_Semester.ToString()).Where(x => x.Value == SchoolcodeID).Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 开课学期
        /// </summary>
        [DisplayName("开课学期")]
        public int? StarttermID { get; set; }

        /// <summary>
        /// 开课学期
        /// </summary>
        [DisplayName("开课学期")]
        public string StarttermName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_Startterm.ToString())
                    .Where(x => x.Value == StarttermID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 学分
        /// </summary>
        [Required]
        [DisplayName("学分")]
        [DisplayFormat(DataFormatString = "{0:#.0}")]
        [RegularExpression(@"^\d+(\.\d{1,1})?$", ErrorMessage = "请输整数或保留1位小数")]
        public decimal? Credit { get; set; }

        /// <summary>
        /// 总学时
        /// </summary>
        [DisplayName("总学时")]
        public int? Totalhours
        {
            get
            {
                if (TheoryCourse == null)
                    TheoryCourse = 0;
                if (Practicehours == null)
                    Practicehours = 0;
                return (TheoryCourse + Practicehours);
            }
        }

        /// <summary>
        /// 上课周次
        /// </summary>
        [DisplayName("上课周次")]
        public int? SchoolweeksNum
        {
            get
            {
                if (TheoryWeeklyNum == null)
                    TheoryWeeklyNum = 0;
                if (PracticeWeeklyNum == null)
                    PracticeWeeklyNum = 0;
                return (TheoryCourse + Practicehours);
            }
            //get { return (this.TheoryWeeklyNum ?? 0 + this.PracticeWeeklyNum ?? 0) ; }
        }

        /// <summary>
        /// 理论学时
        /// </summary>
        [DisplayName("理论学时")]
        public int? TheoryCourse { get; set; }

        /// <summary>
        /// 实践学时
        /// </summary>
        [DisplayName("实践学时")]
        public int? Practicehours { get; set; }

        /// <summary>
        /// 实验学时
        /// </summary>
        [DisplayName("实验学时")]
        public int? Trialhours { get; set; }

        /// <summary>
        /// 每周次数
        /// </summary>
        [DisplayName("每周次数")]
        public int? WeeklyNum { get; set; }

        /// <summary>
        /// 周学时
        /// </summary>
        [DisplayName("周学时")]
        public int? WeeklyHours { get; set; }

        /// <summary>
        /// 理论周数
        /// </summary>
        [DisplayName("理论周数")]
        public int? TheoryWeeklyNum { get; set; }

        /// <summary>
        /// 实践周数
        /// </summary>
        [DisplayName("实践周数")]
        public int? PracticeWeeklyNum { get; set; }

        /// <summary>
        /// 实验周数
        /// </summary>
        [DisplayName("实验周数")]
        public int? TrialWeeklyNum { get; set; }

        /// <summary>
        /// 开始周次
        /// </summary>
        [DisplayName("开始周次")]
        public int? StartWeeklyNum { get; set; }

        /// <summary>
        /// 结束周次
        /// </summary>
        [DisplayName("结束周次")]
        public int? EndWeeklyNum { get; set; }

        /// <summary>
        /// 起止周次
        /// </summary>
        public string StartEndWeeklyNum
        {
            get
            {
                return (this.StartWeeklyNum.HasValue && this.EndWeeklyNum.HasValue) ?
                    (this.StartWeeklyNum.Value.ToString() + "-" + this.EndWeeklyNum.Value.ToString()) : "";
            }
        }

        /// <summary>
        /// 实践类型
        /// </summary>
        [DisplayName("实践类型")]
        public int? PracticeTypeID { get; set; }


        [DisplayName("实践类型")]
        public string PracticeTypeNameStr { get; set; }

        /// <summary>
        /// 实践类型
        /// </summary>
        [DisplayName("实践类型")]
        public string PracticeTypeName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.EM_PracticeType.ToString())
                    .Where(x => x.Value == PracticeTypeID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 限选设定授课方式ID
        /// </summary>
        [DisplayName("限选设定授课方式ID")]
        public Guid? ExecutableOptionalCourseTeachingModeID { get; set; }

        /// <summary>
        /// 授课方式
        /// </summary>
        public virtual HashSet<OptionalCourseTeachingModeView> TeachingMode { get; set; }


        /// <summary>
        /// 授课方式
        /// </summary>
        [DisplayName("授课方式")]
        [Required]
        public List<int> TeachingModeID { get; set; }

        /// <summary>
        /// 授课方式
        /// </summary>
        [DisplayName("授课方式")]
        public List<string> TeachingModeName { get; set; }

        /// <summary>
        /// 考试方式
        /// </summary>
        [Required]
        [DisplayName("考试方式")]
        public int? ExaminationModeID { get; set; }

        /// <summary>
        /// 考试方式
        /// </summary>
        public string ExaminationModeDesc
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_ExaminationMode.ToString())
                    .Where(x => x.Value == ExaminationModeID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 是否需要教材
        /// </summary>
        [DisplayName("是否需要教材")]
        public bool IsNeedMaterial { get; set; }

        /// <summary>
        /// 是否需要教材
        /// </summary>
        public string IsNeedMaterialDesc
        {
            get { return this.IsNeedMaterial == true ? "是" : "否"; }
        }

        /// <summary>
        /// 人数下限
        /// </summary>
        [Required]
        [DisplayName("人数下限")]
        public Nullable<int> PeopleNumlower { get; set; }

        /// <summary>
        /// 人数上限
        /// </summary>
        [Required]
        [DisplayName("人数上限")]
        public Nullable<int> PeopleNumlimit { get; set; }

        /// <summary>
        /// 处理方式
        /// </summary>
        [DisplayName("处理方式")]
        public int? HandleModeID { get; set; }

        /// <summary>
        /// 处理方式
        /// </summary>
        public string HandleModeDesc
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.CF_HandleMode.ToString())
                    .Where(x => x.Value == HandleModeID)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 限选任课老师设定ID
        /// </summary>
        public Guid? ExecutableOptionalCourseTeacherID { get; set; }

        /// <summary>
        /// 授课教师
        /// </summary>
        public virtual HashSet<OptionalCourseTeacherListView> Teachers { get; set; }

        /// <summary>
        /// 限选设定任课老师ID
        /// </summary>
        [DisplayName("任课老师ID")]
        public Guid TeacherID { get; set; }

        /// <summary>
        /// 任课类型
        /// </summary>
        [DisplayName("任课类型")]
        public int? TeachingMethod { get; set; }

        /// <summary>
        /// 教师名称
        /// </summary>
        public string TeacherName 
        {
            get
            {
                var teacherNames = string.Join(",", Teachers.Select(x => x.Name).ToList());
                if (string.IsNullOrEmpty(teacherNames))
                {
                    return "请选择教师";
                }
                else
                {
                    return teacherNames;
                }
            }
        }

        /// <summary>
        /// 教师名称
        /// </summary>
        public string TeacherNames { get; set; }

        /// <summary>
        /// 成绩类型
        /// </summary>
        [Required]
        [DisplayName("成绩类型")]
        public int? ResultTypeID { get; set; }

        /// <summary>
        /// 是否启用
        /// </summary>
        [Required]
        [DisplayName("是否启用")]
        public bool IsEnable { get; set; }

        /// <summary>
        /// 是否启用
        /// </summary>
        public string IsEnableDesc
        {
            get { return this.IsEnable == true ? "是" : "否"; }
        }

        /// <summary>
        /// 开放状态
        /// </summary>
        [Required]
        [DisplayName("开放状态")]
        public bool IsOpened { get; set; }

        /// <summary>
        /// 开放状态
        /// </summary>
        public string IsOpenedDesc
        {
            get { return this.IsOpened == true ? "是" : "否"; } 
        }

        /// <summary>
        /// RecordStatus
        /// </summary>
        public Nullable<int> RecordStatus { get; set; }

        /// <summary>
        /// 选课结果状态代码
        /// </summary>
        public string RecordStatusCode
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.EM_SelectCourseResultStatus.ToString())
                    .Where(x => x.Value == RecordStatus)
                    .Select(x => x.Code).FirstOrDefault();
            }
        }

        /// <summary>
        /// 选课结果状态
        /// </summary>
        [DisplayName("状态")]
        public string RecordStatusName
        {
            get
            {
                return IdNameExt.GetDictionaryItem(DictionaryItem.EM_SelectCourseResultStatus.ToString())
                    .Where(x => x.Value == RecordStatus)
                    .Select(x => x.Name).FirstOrDefault();
            }
        }

        /// <summary>
        /// 
        /// </summary>
        public virtual IEnumerable<Sys_User> Sys_User { get; set; }

        /// <summary>
        /// 学生ID
        /// </summary>
        [DisplayName("学生ID")]
        public Guid? StudentUserID { get; set; }

        /// <summary>
        /// 开放范围
        /// </summary>
        public int? ClassCount { get; set; }

        /// <summary>
        /// 已选人数
        /// </summary>
        [DisplayName("已选人数")]
        public Nullable<int> EnterPeopleNum { get; set; }

        /// <summary>
        /// 教室ID
        /// </summary>
        [DisplayName("教室ID")]
        public Guid? ClassroomID { get; set; }

        /// <summary>
        /// 教室名称
        /// </summary>
        [DisplayName("教室名称")]
        public string ClassroomName { get; set; }

        /// <summary>
        /// 备注
        /// </summary>
        [DisplayName("备注")]
        public string Remarks { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public OptionalCourseSettingView()
        {
            this.TeachingMode = new HashSet<OptionalCourseTeachingModeView>();
            this.Teachers = new HashSet<OptionalCourseTeacherListView>();
        }

        /// <summary>
        /// CreateTime
        /// </summary>
        public Nullable<System.DateTime> CreateTime { get; set; }

        /// <summary>
        /// CreateUserID
        /// </summary>
        public Nullable<System.Guid> CreateUserID { get; set; }

        /// <summary>
        /// ModifyUserID
        /// </summary>
        public Nullable<System.Guid> ModifyUserID { get; set; }

        /// <summary>
        /// ModifyTime
        /// </summary>
        public Nullable<System.DateTime> ModifyTime { get; set; }
    }
}