using System;
using System.Collections.Generic;

namespace mxdemo.Mind
{
    #region model

    public class ElectiveSetting
    {

        //"selectResult": {
        //  "params": {},
        //  "roundId": 8,
        //  "schoolId": 1,
        //  "year": 2021,
        //  "name": "第三次",
        //  "beginTime": "2022-02-16",
        //  "endTime": "2022-02-17",
        //  "groupIds": "1,2,3,10,11,12",
        public int currentGeneration; // 当前报名状态
        public int preferenceCount; // 选填志愿数量

  //  "groupList": [
  //    {
  //      "params": {},
  //      "groupId": 1,
  //      "mask": 448,
  //      "name": "物化生",
  //      "rank": 1
  //    },
  //    {
  //  "params": { },
  //      "groupId": 2,
  //      "mask": 416,
  //      "name": "物化政",
  //      "rank": 2
  //    },
  //    {
  //  "params": { },
  //      "groupId": 3,
  //      "mask": 400,
  //      "name": "物化地",
  //      "rank": 3
  //    },
  //    {
  //  "params": { },
  //      "groupId": 10,
  //      "mask": 56,
  //      "name": "历政地",
  //      "rank": 10
  //    },
  //    {
  //  "params": { },
  //      "groupId": 11,
  //      "mask": 104,
  //      "name": "历政生",
  //      "rank": 11
  //    },
  //    {
  //  "params": { },
  //      "groupId": 12,
  //      "mask": 88,
  //      "name": "历生地",
  //      "rank": 12
  //    }
  //  ],
  //  "state": "1"
  //},
  //"allowSelect": false

    }
    // 评测推荐专业
    public class RecommendMajor
    {
      public string majorCategoryName; // 专业类别
      public int majorCategoryCode; // 专业编码
      public  List<int> matchedGroupIds; // // 匹配哪几个组合？
    }



    // 学生这里无论什么时间得到的都是最终结果，不需要中间快照，以此区分校长的选科数据。
    // 校长的选科数据，初选时与学生相同；补录时也需要这份数据、但也需要初选与补录的差异部分；排名均衡同理
    public class ElectiveSelectModel
    {
        public int groupId; // 组合
        public string groupName; // 名称
        public int classCount; // 班级数
        public int personCount; // 人数设置

        // 5.7 hht +字段，用来展示报告
        public int groupIndicator; // 组合指标 // primary时为设置人数，之后为决策完毕后剩余的设置数
        public int rankInIndicator; // 组合指标排名
        public int rankInBest; // bestInIndicator中的排名
        public int rankInDisenroll; // 全组合指标排名，即所有未录取人员中的排名 // 可能没用
        public int bestInIndicator; // 未录取组合排名最优人数 // 这是一个解释数据，并没有直接参与计算
        public decimal scoreSumAll; // 9门成绩
        public decimal scoreSumGroup; // 6门成绩
        public bool isRecommend; // 推荐组合

        public int rankInGroup; // 选科实时排名
        public int rankInGrade; // 选科全校排名
        public bool allowSelect; // 是否可以报名
        public string disabledReason; // 不可报名时的原因

        public bool selected;  // 已报名
        // 5.13 如果是多志愿，按selectedRank区分一志愿、二志愿、三志愿...
        public int selectedRank; // 多志愿时的排序

        // 5.13 去除动态列，改为固定字段 +
        public int actualCount; // 阶段实际报名人数
        public bool approved; // 已被正常录取
        public bool forceAdjusted; // 已被调剂录取
        public int groupApprovedCount; // 本组合已被录取人数（迭代值）
        public int groupForceAdjustedCount; // 本组合已被强制调剂人数（迭代值）
    }

    public class ElectiveSelectGroupStatistics {
      public string name; // stat column name
      public ElectiveGeneration.ElectiveGroupGenerationStatistic[] groupDescriptors;
    }
    ;
    public class ElectiveSelectModelWrapper {
      public ElectiveSelectModel[] models;
      public int generation;
      public long studentId;
    }

    // 自选专业
    public class ElectiveOptionalMajor
    {
        public int collegeId;
        public string collegeName;
        // 可能还包含院校的一些其它属性

        public string majorCategoryCode;
        public string majorCategoryName;

        public Dictionary<string, string> majors;

        public string limitationA; // 选科限制1
        public string limitationB; // 选科限制2

        public List<int> matchedGroupIds; // 匹配的组合
    }

    #endregion

    // 本期会涉及很多隐藏需求，前端会去back-ui按页面+按功能设置很多按钮功能，后续配置为权限组来操作
    // 本期后台输出数据的时候不需要按权限屏蔽数据，全量输出即可，以减少后端开发的工作量
    // 因为本期要控制隐藏的内容比功能入口、API入口要更精细的粒度，可能是列表的某几列，可能是某些按钮，如果严格API数据规范可能会增加海量的工作。
    public interface IPrimaryElectiveService
    {
        // 旧接口getStudentSelected，返回内容+preferenceCount，志愿数
        ElectiveSetting getStudentSelected();

        // 学生获取选科状态数据，得到是每个组合最终状态和结果
        // 5.13 返回迭代至generation的多代选科表，如查询补录报名，即返回初录报名/初录结果/补录报名3代的模型集合
        ElectiveSelectModelWrapper[] getStudentElectiveModels(long studentId, int generation);

        // 学生获取自选专业及匹配情况
        List<ElectiveOptionalMajor> getOptionalMajors();

        // 初选报名。这里简化原型里的操作，直接提交，如需排序，调sortElectiveSelected接口，并刷新getPrimaryElectivesx
        void submitPrimaryElective(ElectiveSelectModel model);

        // 调整排序。这里简化原型里的操作，并刷新getPrimaryElectives
        void sortPrimaryElective(ElectiveSelectModel model);

        // 取消报名
        void cancelPrimaryElective(ElectiveSelectModel model);

        // 返回学生测评推荐专业以及匹配情况
        List<RecommendMajor> getRecommendMajor();
//        /*
//          AI分析
//          需要的字段：
//          详细见analysis.json
//        */
//        List<ElectiveSelectGroupStatistics> getAIAnalysis()
    }
}
