import { request } from "./request";
import type { PageResult, UserSimple } from "./purchase";

export interface CalTeam {
  id?: number;
  code?: string;
  name?: string;
  calendarType?: number;
  remark?: string;
  createTime?: string;
}

export interface CalTeamMember {
  id?: number;
  teamId?: number;
  userId?: number;
  nickname?: string;
  telephone?: string;
  remark?: string;
}

export interface CalPlan {
  id?: number;
  code?: string;
  name?: string;
  calendarType?: number;
  startDate?: string;
  endDate?: string;
  shiftType?: number;
  shiftMethod?: number;
  shiftCount?: number;
  status?: number;
  remark?: string;
  createTime?: string;
}

export interface CalPlanShift {
  id?: number;
  planId?: number;
  sort?: number;
  name?: string;
  startTime?: string;
  endTime?: string;
  remark?: string;
}

export interface CalPlanTeam {
  id?: number;
  planId?: number;
  teamId?: number;
  teamCode?: string;
  teamName?: string;
  remark?: string;
}

export interface CalHoliday {
  id?: number;
  day?: string | number;
  type?: number;
  remark?: string;
  createTime?: string;
}

export interface CalCalendarTeamShift {
  teamId?: number;
  teamName?: string;
  shiftId?: number;
  shiftName?: string;
  sort?: number;
}

export interface CalCalendarDay {
  day?: string;
  shiftType?: number;
  teamShifts?: CalCalendarTeamShift[];
}

const header = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
function query(params: Record<string, string | number | boolean | Array<string | number | boolean> | undefined>) {
  const content = Object.entries(params)
    .filter(([, value]) => value !== undefined && value !== "")
    .flatMap(([key, value]) => Array.isArray(value)
      ? value.map(item => `${encodeURIComponent(key)}=${encodeURIComponent(String(item))}`)
      : `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
    .join("&");
  return content ? `?${content}` : "";
}

export function getTeamPage(accessToken: string, params: { pageNo: number; pageSize: number; code?: string; name?: string; calendarType?: number }) {
  return request<PageResult<CalTeam>>(`/mes/cal/team/page${query(params)}`, { header: header(accessToken) });
}
export function getTeamList(accessToken: string) {
  return request<CalTeam[]>("/mes/cal/team/list", { header: header(accessToken) });
}
export function getTeam(accessToken: string, id: number) {
  return request<CalTeam>(`/mes/cal/team/get${query({ id })}`, { header: header(accessToken) });
}
export function createTeam(accessToken: string, data: CalTeam) {
  return request<number>("/mes/cal/team/create", { method: "POST", data, header: header(accessToken) });
}
export function updateTeam(accessToken: string, data: CalTeam) {
  return request<boolean>("/mes/cal/team/update", { method: "PUT", data, header: header(accessToken) });
}
export function deleteTeam(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/team/delete${query({ id })}`, { method: "DELETE", header: header(accessToken) });
}
export function getTeamMemberListByTeam(accessToken: string, teamId: number) {
  return request<CalTeamMember[]>(`/mes/cal/team-member/list-by-team${query({ teamId })}`, { header: header(accessToken) });
}
export function createTeamMember(accessToken: string, data: CalTeamMember) {
  return request<number>("/mes/cal/team-member/create", { method: "POST", data, header: header(accessToken) });
}
export function deleteTeamMember(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/team-member/delete${query({ id })}`, { method: "DELETE", header: header(accessToken) });
}

export function getPlanPage(accessToken: string, params: { pageNo: number; pageSize: number; code?: string; name?: string; shiftType?: number; status?: number }) {
  return request<PageResult<CalPlan>>(`/mes/cal/plan/page${query(params)}`, { header: header(accessToken) });
}
export function getPlan(accessToken: string, id: number) {
  return request<CalPlan>(`/mes/cal/plan/get${query({ id })}`, { header: header(accessToken) });
}
export function createPlan(accessToken: string, data: CalPlan) {
  return request<number>("/mes/cal/plan/create", { method: "POST", data, header: header(accessToken) });
}
export function updatePlan(accessToken: string, data: CalPlan) {
  return request<boolean>("/mes/cal/plan/update", { method: "PUT", data, header: header(accessToken) });
}
export function confirmPlan(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/plan/confirm${query({ id })}`, { method: "PUT", header: header(accessToken) });
}
export function deletePlan(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/plan/delete${query({ id })}`, { method: "DELETE", header: header(accessToken) });
}
export function getPlanShiftListByPlan(accessToken: string, planId: number) {
  return request<CalPlanShift[]>(`/mes/cal/plan-shift/list-by-plan${query({ planId })}`, { header: header(accessToken) });
}
export function createPlanShift(accessToken: string, data: CalPlanShift) {
  return request<number>("/mes/cal/plan-shift/create", { method: "POST", data, header: header(accessToken) });
}
export function updatePlanShift(accessToken: string, data: CalPlanShift) {
  return request<boolean>("/mes/cal/plan-shift/update", { method: "PUT", data, header: header(accessToken) });
}
export function deletePlanShift(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/plan-shift/delete${query({ id })}`, { method: "DELETE", header: header(accessToken) });
}
export function getPlanTeamListByPlan(accessToken: string, planId: number) {
  return request<CalPlanTeam[]>(`/mes/cal/plan-team/list-by-plan${query({ planId })}`, { header: header(accessToken) });
}
export function createPlanTeam(accessToken: string, data: CalPlanTeam) {
  return request<number>("/mes/cal/plan-team/create", { method: "POST", data, header: header(accessToken) });
}
export function deletePlanTeam(accessToken: string, id: number) {
  return request<boolean>(`/mes/cal/plan-team/delete${query({ id })}`, { method: "DELETE", header: header(accessToken) });
}

export function getHolidayList(accessToken: string, params?: { startDay?: string; endDay?: string }) {
  return request<CalHoliday[]>(`/mes/cal/holiday/list${query(params || {})}`, { header: header(accessToken) });
}
export function getHolidayByDay(accessToken: string, day: string) {
  return request<CalHoliday>(`/mes/cal/holiday/get-by-day${query({ day })}`, { header: header(accessToken) });
}
export function saveHoliday(accessToken: string, data: CalHoliday) {
  return request<boolean>("/mes/cal/holiday/save", { method: "POST", data, header: header(accessToken) });
}
export function getCalendarList(accessToken: string, params: { queryType: string; calendarType?: number; teamId?: number; userId?: number; startDay?: string; endDay?: string }) {
  return request<CalCalendarDay[]>(`/mes/cal/calendar/list${query(params)}`, { header: header(accessToken) });
}
export function getUserSimpleList(accessToken: string) {
  return request<UserSimple[]>("/system/user/simple-list", { header: header(accessToken) });
}
