using System;
using System.Collections.Generic;

namespace mxdemo.Mind
{
    #region model

    public class FacultyForm
    {
        public int subjectId;   // 这个想想「班会、体育、自习」怎么处理？
        public string subjectName; // 名称
        public bool isFixed; // 固定师资，用以区分6门合格考与等级考学科，非固定科目需要填写合格考与等级考
        public bool isOffical; // 正式科目，9科为正式科目，非正式科目提供的校验不一样
        public int classesCountPrev; // 周课时数-分班前-仅参考用
        public int teacherCount; // 单科老师数量
        public int teacherClassesCount; // 单科老师周课时数
        public int classesCount; // 单科总课时数，前端会提供辅助计算
        public int levelClassesCount; // 等级考课时数-分班后
        public int qualifiedClassesCount; // 合格考课时数-分班后
    }

    public class FacultyResult : FacultyForm
    {
        public int levelClassCount; // 等级考班级数
        public int qualifiedClassCount; // 合格考班级数
        public int requiredClassesCount; // 所需课时
        public int actualClassesCount; // 实际课时
        public int missingClassesCount; // 缺少课时，正数表示缺的，负数表示超的
        public int missingTeacherCount; // 缺少老师，正负同上
    }

    public class GroupSetting
    {
        // 略，延用之前的结构内容
    }

    public class GroupModel
    {
        // 后台自己设置标识，前端会原样返回，前端展示与操作只会用到索引
        public string groupIds;
        public List<GroupSetting> roundGroups;
        public List<FacultyResult> faculties;
    }

    public class ScoreImportConfig // 需要调整结构
    {
        #region 不变部分
        //      {
        //"params": {},
        //"roundId": 14,
        //"schoolId": 31,
        //"year": 2021,
        //"name": "第1次选科",
        //"beginTime": "2022-03-05",
        //"endTime": "2022-03-20",
        //"state": "1",
        //"importWeight":[]
        #endregion

        #region 变更部分
        // 新增模型列表
        public List<GroupModel> groupModels;
        // 选择其中1个模型
        public int activeGroupModelIndex; // 构想的是传索引，因为前端会做删除等调整，而且新建时也可能同时创建多个引用，此时无ID能够做出区分
        // 选志愿的数量，默认为1
        public int preferenceCount = 1;
        #endregion

        #region 新增控制配置
        public bool rankInvisible; // 排名不可见，默认false: 排名可见
        public bool scoreInvisible; // 分数不可见，默认false: 分数可见
        public bool enableEsign;  // 开启电子签名，默认false: 不需要
        public bool enablePaperSign; // 开启电子签名的情况下，是否需要纸质签名(促进学生使用班牌)，默认false: 不需要
        #endregion
    }

    #endregion

    public interface ISelectedScoreImport
    {
        // ScoreImportConfig的结构有变化见上面region
        ScoreImportConfig getScoreImportConfig(int roundId);

        /// <summary>
        /// 生成空的师资表格，在校长全部重新填写的时候调用。如果是从已完成的模型复制，则不会调用，前端会自行处理
        /// </summary>
        /// <returns></returns>
        List<FacultyResult> generateFaculties();

        // 计算师资匹配结果
        // 构想：全量传数据，但后台只挑需要的groupModels[targetIndex]进行计算，计算完毕标记为completed=true
        // 计算结束，需要标记出groupModels中，completed=true的模型，最优解为isBest=true
        // 最优解：faculties.sum(f => Math.Abs(f.missingTeacherCount)) 总和最小的GroupModel为最优
        ScoreImportConfig calculateFaculty(ScoreImportConfig round, int groupModelIndex);

        void saveScoreImportConfig({ round: ScoreImportConfig }); // config结构变了，保存也要注意

        void queryScoreImportDetails({ round: ScoreImportConfig, groupModelIndex: int }); // config结构变了，查询时要指定哪个模型
    }
}
