import type { PageParam, PageResult } from '@vben/request';

import { requestClient } from '#/api/request';

export namespace MesCalScheduleDetailApi {
  /** MES 员工排班明细 */
  export interface Detail {
    id?: number; // 明细编号
    planId?: number; // 排班计划编号
    teamId?: number; // 班组编号
    userId?: number; // 班组成员用户编号
    day?: Date; // 日期
    shiftId?: number; // 班次编号
    shiftName?: string; // 班次名称
    startTime?: string; // 开始时间（HH:mm）
    endTime?: string; // 结束时间（HH:mm）
    source?: number; // 来源：1-自动生成 2-人工调整
    remark?: string; // 备注
  }

  /** 员工排班明细查询参数 */
  export interface DetailPageParam extends PageParam {
    planId?: number; // 排班计划编号
    teamId?: number; // 班组编号
    userId?: number; // 班组成员用户编号
    startDay?: string; // 开始日期
    endDay?: string; // 结束日期
  }

  /** 合规校验结果项 */
  export interface CheckItem {
    day?: string; // 日期
    shiftName?: string; // 班次名称
    startTime?: string; // 开始时间（HH:mm）
    endTime?: string; // 结束时间（HH:mm）
    issueType?: number; // 违规类型：1-单日疑似连续工时超长 2-相邻班次间休息不足
    issue?: string; // 问题描述，为空表示该班次合规
  }

  /** 合规校验参数 */
  export interface CheckParam {
    userId: number; // 班组成员用户编号
    startDay?: string; // 起始日期
    endDay?: string; // 结束日期
  }
}

/** 查询员工排班明细分页 */
export function getDetailPage(params: MesCalScheduleDetailApi.DetailPageParam) {
  return requestClient.get<PageResult<MesCalScheduleDetailApi.Detail>>(
    '/mes/cal/schedule-detail/page',
    { params },
  );
}

/** 查询员工排班明细列表 */
export function getDetailList(
  params: MesCalScheduleDetailApi.DetailPageParam,
): Promise<MesCalScheduleDetailApi.Detail[]> {
  return requestClient.get<MesCalScheduleDetailApi.Detail[]>(
    '/mes/cal/schedule-detail/list',
    { params },
  );
}

/** 按班组排班生成员工级排班明细 */
export function generateDetails(planId: number) {
  return requestClient.post(
    `/mes/cal/schedule-detail/generate?planId=${planId}`,
  );
}

/** 更新员工排班明细（人工微调） */
export function updateDetail(data: MesCalScheduleDetailApi.Detail) {
  return requestClient.put('/mes/cal/schedule-detail/update', data);
}

/** 员工排班合规校验 */
export function checkCompliance(
  params: MesCalScheduleDetailApi.CheckParam,
): Promise<MesCalScheduleDetailApi.CheckItem[]> {
  return requestClient.get<MesCalScheduleDetailApi.CheckItem[]>(
    '/mes/cal/schedule-detail/check',
    { params },
  );
}
