import httpClient from '@/utils/http';

import {
  ControllerResponse,
  ModelChangeStudentPasswordRequest,
  ModelCreateStudentRequest,
  ModelStudent,
  ModelUpdateStudentRequest,
  ServiceStudentWithSubjectName
} from './data-contracts';
export default {
  /**
   * @description 创建新的学生（仅学校管理员可操作，自动生成系统ID，默认密码为111111）
   */
  studentsCreate: (student: ModelCreateStudentRequest) => {
    return httpClient.post<
      ControllerResponse & {
        /** 学生信息模型 */
        data?: ModelStudent;
      }
    >(`/students`, { params: student });
  },
  /**
   * @description 获取所有学生的列表信息（分页和筛选），根据用户角色自动过滤学校
   */
  studentsList: (query: {
    /**
     * 页码
     * @default 1
     */
    page?: number;
    /**
     * 每页数量
     * @default 10
     */
    page_size?: number;
    /** 年级Key筛选 */
    grade_key?: number;
    /** 班级Key筛选 */
    class_key?: number;
    /** 选考科目ID筛选 */
    elective_subject?: string;
    /** 学生标签筛选 */
    student_tag?: string;
    /** 关键词搜索（姓名或考号） */
    keyword?: string;
  }) => {
    return httpClient.get<
      ControllerResponse & {
        data?: {
          list?: ServiceStudentWithSubjectName[];
          page?: number;
          page_size?: number;
          total?: number;
        };
      }
    >(`/students`, { query: query });
  },
  /**
   * @description 通过Excel文件批量新增学生，导入文件中不应包含系统号，系统会自动生成。会检查学号重复（包括文件内重复和与数据库重复）
   */
  batchImportCreate: (data: any) => {
    return httpClient.formData<
      ControllerResponse & {
        data?: Record<string, any>;
      }
    >(`/students/batch-import`, { params: data });
  },
  /**
   * @description 导出符合条件的学生数据为Excel文件，默认包含系统号
   */
  exportList: () => {
    return httpClient.download<Blob>(`/students/export`);
  },
  /**
   * @description 下载学生批量导入的Excel模板文件
   */
  templateDownloadList: () => {
    return httpClient.download<Blob>(`/students/template/download`);
  },
  /**
   * @description 下载学生信息更新的Excel模板文件
   */
  templateUpdateDownloadList: () => {
    return httpClient.download<Blob>(`/students/template/update_download`);
  },
  /**
   * @description 通过Excel文件更新学校下全部学生信息，通过年级+姓名+班级三个维度查找学生进行更新。如果不存在，直接报错；如果存在一个，直接更新；如果大于1个，返回重名列表（使用考号区分）。如果传递了same_name_list参数，会根据用户选择直接更新对应学生
   */
  updateAllCreate: (data: {
    /**
     * Excel文件
     * @format binary
     */
    file: File;
    /** 重名学生选择列表，JSON格式，用于解决重名问题 */
    same_name_list?: string;
  }) => {
    return httpClient.formData<
      ControllerResponse & {
        data?: Record<string, any>;
      }
    >(`/students/update-all`, { params: data });
  },
  /**
   * @description 根据学生ID获取特定学生的详细信息
   */
  studentsDetail: (id: number) => {
    return httpClient.get<
      ControllerResponse & {
        /** 学生信息模型 */
        data?: ModelStudent;
      }
    >(`/students/${id}`);
  },
  /**
   * @description 根据ID更新学生信息
   */
  studentsUpdate: (id: string, student: ModelUpdateStudentRequest) => {
    return httpClient.put<
      ControllerResponse & {
        /** 学生信息模型 */
        data?: ModelStudent;
      }
    >(`/students/${id}`, { params: student });
  },
  /**
   * @description 根据ID删除学生（软删除）
   */
  studentsDelete: (id: string) => {
    return httpClient.delete<
      ControllerResponse & {
        message?: string;
      }
    >(`/students/${id}`);
  },
  /**
   * @description 修改学生密码（无需验证旧密码）
   */
  passwordUpdate: (id: string, req: ModelChangeStudentPasswordRequest) => {
    return httpClient.put<
      ControllerResponse & {
        message?: string;
      }
    >(`/students/${id}/password`, { params: req });
  }
};
