import type { SignModeItem, SignModePageQuery } from './types';

function delay<T>(data: T, ms = 180): Promise<T> {
  return new Promise((resolve) => setTimeout(() => resolve(data), ms));
}

const store: SignModeItem[] = [
  {
    id: 'tms_sign_app',
    modeCode: 'app_scan',
    modeName: 'APP扫码',
    tipSeconds: 30,
    matchRoster: '1',
    enabled: '1',
    remark: '系统 APP 扫码（图片识别 / 摄像头 / 长按识码）',
  },
  {
    id: 'tms_sign_wx',
    modeCode: 'wx_scan',
    modeName: '微信扫码',
    tipSeconds: 30,
    matchRoster: '1',
    enabled: '1',
    remark: '微信扫码签到',
  },
  {
    id: 'tms_sign_online',
    modeCode: 'online',
    modeName: '在线签到',
    tipSeconds: 30,
    matchRoster: '1',
    enabled: '1',
    remark: '登录系统在线签到',
  },
];

export function mockQuerySignModes(params: SignModePageQuery = {}) {
  const { currentPage = 1, pageSize = 20, keyword = '', enabled } = params;
  let list = [...store];
  if (enabled) list = list.filter((x) => x.enabled === enabled);
  if (keyword) {
    const k = keyword.trim().toLowerCase();
    list = list.filter(
      (x) => x.modeCode.toLowerCase().includes(k) || x.modeName.toLowerCase().includes(k),
    );
  }
  const start = (currentPage - 1) * pageSize;
  return delay({
    list: list.slice(start, start + pageSize),
    pagination: { total: list.length, currentPage, pageSize },
  });
}

export async function mockGetSignMode(id: string) {
  await delay(null);
  const row = store.find((x) => x.id === id);
  if (!row) throw new Error('签到方式不存在');
  return { ...row };
}

export async function mockSaveSignMode(data: Partial<SignModeItem> & { id?: string }) {
  await delay(null);
  if (data.id) {
    const row = store.find((x) => x.id === data.id);
    if (!row) throw new Error('签到方式不存在');
    if (data.modeCode && data.modeCode !== row.modeCode) {
      if (store.some((x) => x.modeCode === data.modeCode && x.id !== data.id)) {
        throw new Error('方式编码已存在');
      }
    }
    Object.assign(row, data);
    return row;
  }
  if (!data.modeCode) throw new Error('请填写方式编码');
  if (store.some((x) => x.modeCode === data.modeCode)) throw new Error('方式编码已存在');
  const row: SignModeItem = {
    id: `sm_${Date.now()}`,
    modeCode: data.modeCode,
    modeName: data.modeName || data.modeCode,
    tipSeconds: data.tipSeconds ?? 30,
    matchRoster: (data.matchRoster as any) || '1',
    enabled: (data.enabled as any) || '1',
    remark: data.remark || '',
  };
  store.push(row);
  return row;
}

export async function mockSetSignModeEnabled(id: string, enabled: '0' | '1') {
  await delay(null);
  const row = store.find((x) => x.id === id);
  if (!row) throw new Error('签到方式不存在');
  row.enabled = enabled;
  return row;
}

export async function mockDeleteSignMode(id: string) {
  await delay(null);
  const idx = store.findIndex((x) => x.id === id);
  if (idx < 0) throw new Error('签到方式不存在');
  store.splice(idx, 1);
  return true;
}
