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

/**
 * 医生排班配置 API（后端 xk-api /doctor-schedule）
 * 排班规则：出诊模式（每天/按星期）× 时段类型（全天/上下午/自定义）× 各时段号源数 × 可预约天数
 */
const prefix = 'doctor-schedule/';

/** 排班时段项 */
export interface ScheduleSlot {
  id?: number;
  slot_name: string;
  start_time: string;
  end_time: string;
  capacity: number;
}

/** 排班配置回显（doctor_id 为 su_id） */
export async function getDoctorScheduleApi(doctorId: number) {
  return requestClient.get<any>(`${prefix}detail`, {
    params: { doctor_id: doctorId },
  });
}

/** 保存医生排班（规则 + 时段整体提交，doctor_id 为 su_id） */
export async function saveDoctorScheduleApi(data: Record<string, any>) {
  return requestClient.post<any>(`${prefix}save`, data);
}

/** 门店统一挂号设置回显（诊所管理员不传 store_id 固定本店） */
export async function getStoreRegisterSettingApi(storeId?: number) {
  return requestClient.get<any>(`${prefix}get-store-setting`, {
    params: storeId ? { store_id: storeId } : {},
  });
}

/** 保存门店统一可预约天数 */
export async function saveStoreRegisterSettingApi(data: Record<string, any>) {
  return requestClient.post<any>(`${prefix}save-store-setting`, data);
}

/** 排班月历某天的时段（含已约数） */
export interface ScheduleDaySlot {
  slot_id: number;
  slot_name: string;
  start_time: string;
  end_time: string;
  capacity: number;
  used: number;
}

/** 排班月历中的一天 */
export interface ScheduleCalendarDay {
  date: string;
  date_ts: number;
  week: number;
  is_past: boolean;
  is_today: boolean;
  /** 排班来源：day=按日期排班（覆盖） rule=默认规则 */
  source: 'day' | 'rule';
  is_rest: boolean;
  is_work: boolean;
  total: number;
  used_total: number;
  slots: ScheduleDaySlot[];
  /** 全店视角：该日被按日排班安排值班的医生数（格子「值班 N 人」徽标） */
  store_duty_count?: number;
}

/** 班次模板（店级通用 doctor_id=0；医生专属 doctor_id>0，添加该医生排班时优先按专属写入） */
export interface ShiftTemplate {
  id: number;
  store_id: number;
  doctor_id?: number;
  doctor_name?: string;
  name: string;
  slots: ScheduleSlot[];
  sort: number;
  status: number;
}

/** 排班月历（管理端日历排班视图，doctor_id 为 su_id；store_id 用于按店解析可约窗口提示） */
export async function getScheduleMonthCalendarApi(
  doctorId: number,
  month: string,
  storeId?: number,
) {
  return requestClient.get<any>(`${prefix}month-calendar`, {
    params: { doctor_id: doctorId, month, ...(storeId ? { store_id: storeId } : {}) },
  });
}

/**
 * 批量按日期排班（doctor_id 单医生 / doctor_ids 多医生批量，二选一或同传自动合并去重）
 * action：apply_template 套班次模板 / custom 自定义时段 / rest 设休诊 / clear 恢复默认规则
 * prefer_doctor_template=1（仅套模板）：优先按各医生的专属模板写入，template_id 作为无专属医生的通用兜底（可为 0，要求人人有专属）
 */
export async function saveScheduleDaysApi(data: {
  action: 'apply_template' | 'clear' | 'custom' | 'rest';
  dates: string[];
  doctor_id?: number;
  doctor_ids?: number[];
  prefer_doctor_template?: number;
  slots?: ScheduleSlot[];
  store_id?: number;
  template_id?: number;
}) {
  return requestClient.post<any>(`${prefix}save-days`, data);
}

/** 出诊医生查询结果项（working_days=在所查日期中出诊的天数） */
export interface WorkingDoctor {
  id: number;
  name: string;
  avatar: string;
  working_days: number;
}

/** 查询门店医生在指定日期集合的出诊命中天数（「选出诊医生」一键勾选用） */
export async function getWorkingDoctorsApi(storeId: number, dates: string[]) {
  return requestClient.get<any>(`${prefix}working-doctors`, {
    params: { store_id: storeId, dates },
  });
}

/** 矩阵总览中的一格（某医生某天） */
export interface MatrixCell {
  date: string;
  /** 来源：day=日排班覆盖 rule=默认规则 default=未配置（每天全天） */
  source: 'day' | 'default' | 'rule';
  is_work: boolean;
  is_rest: boolean;
  slots: ScheduleSlot[];
  slot_names: string[];
  total: number;
  used: number;
}

/** 矩阵总览日期轴项 */
export interface MatrixDate {
  date: string;
  date_ts: number;
  day: number;
  week_text: string;
  is_today: boolean;
  is_past: boolean;
}

/** 矩阵总览医生行 */
export interface MatrixDoctor {
  id: number;
  name: string;
  avatar: string;
  cells: MatrixCell[];
}

/** 门店排班矩阵总览（医生×日期，默认一周 7 列） */
export async function getStoreMatrixApi(storeId: number, start: string, days = 7) {
  return requestClient.get<any>(`${prefix}store-matrix`, {
    params: { store_id: storeId, start, days },
  });
}

/** 班次模板列表（店级，含禁用项） */
export async function getShiftTemplateListApi(storeId?: number) {
  return requestClient.get<any>(`${prefix}template-list`, {
    params: storeId ? { store_id: storeId } : {},
  });
}

/** 保存班次模板（id=0 新增） */
export async function saveShiftTemplateApi(data: Record<string, any>) {
  return requestClient.post<any>(`${prefix}save-template`, data);
}

/** 删除班次模板（软删，日排班行是时段快照不受影响） */
export async function deleteShiftTemplateApi(id: number, storeId?: number) {
  return requestClient.post<any>(`${prefix}delete-template`, {
    id,
    ...(storeId ? { store_id: storeId } : {}),
  });
}
