import request    from '@/request/alova';
import { Method } from 'alova';


const defaultDictionaries = [
  {
    'dictName': '职业',
    'dictType': 'job',
    'items': [
      { 'dictLabel': '一般行政人员', 'dictValue': '0' },
      { 'dictLabel': '久坐、久站、弯腰工作者', 'dictValue': '1' },
      { 'dictLabel': '企事业单位负责人', 'dictValue': '2' },
      { 'dictLabel': '中层管理', 'dictValue': '3' },
      { 'dictLabel': '接触有毒化学物作业者', 'dictValue': '4' },
      { 'dictLabel': '接触粉尘作业者', 'dictValue': '5' },
      { 'dictLabel': '轮班或夜班工作者', 'dictValue': '6' },
      { 'dictLabel': '户外工作者', 'dictValue': '7' },
      { 'dictLabel': '运动员', 'dictValue': '8' },
      { 'dictLabel': '其他', 'dictValue': '9' },
    ],
  },
  {
    'dictName': '系统是否',
    'dictType': 'sys_yes_no',
    'items': [
      { 'dictLabel': '是', 'dictValue': 'Y' },
      { 'dictLabel': '否', 'dictValue': 'N' },
    ],
  },
  {
    'dictName': '食物过敏',
    'dictType': 'food_allergy',
    'items': [
      { 'dictLabel': '无', 'dictValue': '0' },
      { 'dictLabel': '海鲜', 'dictValue': '1' },
      { 'dictLabel': '鸡蛋', 'dictValue': '2' },
      { 'dictLabel': '花生', 'dictValue': '3' },
      { 'dictLabel': '大豆', 'dictValue': '4' },
      { 'dictLabel': '牛奶', 'dictValue': '5' },
      { 'dictLabel': '坚果', 'dictValue': '6' },
      { 'dictLabel': '芒果', 'dictValue': '7' },
      { 'dictLabel': '其他', 'dictValue': '8' },
    ],
  },
  {
    'dictName': '指标精度',
    'dictType': 'quota_precision',
    'items': [
      { 'dictLabel': '小数点后2位', 'dictValue': '0' }, { 'dictLabel': '小数点后1位 ', 'dictValue': '1' },
      { 'dictLabel': '到个位数，只有偶数', 'dictValue': '2' }, { 'dictLabel': '到个位数', 'dictValue': '3' },
    ],
  }, {
    'dictName': '喜好口味',
    'dictType': 'hobby_flavor',
    'items': [
      { 'dictLabel': '清淡', 'dictValue': '0' }, { 'dictLabel': '酸', 'dictValue': '1' }, { 'dictLabel': '甜', 'dictValue': '2' },
      { 'dictLabel': '苦', 'dictValue': '3' }, { 'dictLabel': '辣', 'dictValue': '4' }, { 'dictLabel': '咸鲜味', 'dictValue': '5' },
      { 'dictLabel': '酸甜味', 'dictValue': '6' }, { 'dictLabel': '香辣味', 'dictValue': '7' }, { 'dictLabel': '麻辣味', 'dictValue': '8' },
      { 'dictLabel': '酸辣味', 'dictValue': '9' }, { 'dictLabel': '蒜泥味', 'dictValue': '10' }, { 'dictLabel': '椒麻味', 'dictValue': '11' },
      { 'dictLabel': '咖喱味', 'dictValue': '12' }, { 'dictLabel': '芥末味', 'dictValue': '13' },
    ],
  }, {
    'dictName': '用户性别',
    'dictType': 'sys_user_sex',
    'items': [ { 'dictLabel': '男', 'dictValue': '0' }, { 'dictLabel': '女', 'dictValue': '1' }, { 'dictLabel': '未知', 'dictValue': '2' } ],
  }, {
    'dictName': '系统开关',
    'dictType': 'sys_normal_disable',
    'items': [ { 'dictLabel': '正常', 'dictValue': '0' }, { 'dictLabel': '停用', 'dictValue': '1' } ],
  }, {
    'dictName': '女性特殊期',
    'dictType': 'women_special_period',
    'items': [
      { 'dictLabel': '无', 'dictValue': '0' }, { 'dictLabel': '月经期', 'dictValue': '1' }, { 'dictLabel': '孕期', 'dictValue': '2' },
      { 'dictLabel': '产后', 'dictValue': '3' }, { 'dictLabel': '哺乳期', 'dictValue': '4' },
    ],
  }, {
    'dictName': '删除标志',
    'dictType': 'del_flag',
    'items': [ { 'dictLabel': '存在', 'dictValue': '0' }, { 'dictLabel': '删除', 'dictValue': '2' } ],
  },
] as const;

type Key = typeof defaultDictionaries[number]['dictType']

export async function dictionaryMethod() {
  // @ts-ignore
  const dictionaries: Record<Key, { dictLabel: string; dictValue: string; }[]> = {};
  for ( const { dictType, items } of defaultDictionaries ) {
    // @ts-ignore
    dictionaries[ dictType ] = items;
  }
  return dictionaries;
}


const PatientDictionaries = [
  { label: '职业', value: 'job' },
  { label: '系统是否', value: 'sys_yes_no' },
  { label: '食物过敏', value: 'food_allergy' },
  { label: '喜好口味', value: 'hobby_flavor' },
  { label: '用户性别', value: 'sys_user_sex' },
  { label: '女性特殊期', value: 'women_special_period' },
] as const;

type PatientDictionaryKeys = ( typeof PatientDictionaries )[number]['value'];

interface Dictionary {
  label: string;
  value: string;
}

export type DictionaryKeys = PatientDictionaryKeys
export type Dictionaries = Record<DictionaryKeys, Dictionary[] & { __label__: string }>;


export function getDictionaryMethod(key: string) {
  return request.Get(`/system/dict/data/type/${ key }`, {
    cacheFor: {
      mode: 'restore',
      expire: 1000 * 60 * 60 * 24,
      tag: __APP_VERSION__,
    },
    transform(data: any[], headers) {
      return data?.map(item => (
        {
          label: item.dictLabel,
          value: item.dictValue,
        }
      )) ?? [];

    },
  });
}


export function patientDictionariesMethod() {
  type _Dictionaries = Dictionary[] & { __label__: string }
  const gather = Promise.all(PatientDictionaries.map(({ label, value }) => getDictionaryMethod(value).then(
    (data) => Object.assign<Dictionary, { data: Dictionary[] }>({ label, value }, { data }),
    () => Object.assign<Dictionary, { data: Dictionary[] }>({ label, value }, { data: [] }),
  ))).then(list => list.reduce<Dictionaries>((values, { label, value, data }) => {
    const _data = data as _Dictionaries;
    _data[ '__label__' ] = label;
    values[ <PatientDictionaryKeys> value ] = _data;
    return values;
  }, <any> {}));
  const method = request.Get<Record<PatientDictionaryKeys, _Dictionaries>>(`/temp`, {
    timeout: 1,
    cacheFor: null,
  });
  // @ts-ignore
  method.send = () => gather;
  return method;
}


export function herbalMedicineUnitMethod() {
  const method = new Method('GET', request, '/temp', {
    timeout: 1,
    cacheFor: null,
  });
  // @ts-ignore
  method.send = () => {
    return [
      { label: '克', value: '克' },
    ];
  };
  return method;
}

export function schemeCategoryOptionsMethod() {
  return getDictionaryMethod('condition_type');
}

export function medicinesMethod(page: number, size: number, query?: Record<string, any>) {
  return request.Post(
    `/fdhb-pc/analysisManage/pageMedicine`,
    { page, limit: size, keyWord: query?.keyword, ...query },
    {
      transform(data: any, headers) {
        return {
          data: data.records,
          total: data.total,
        };
      },
    },
  );
}

export function cpMedicinesMethod(page: number, size: number, query?: Record<string, any>) {
  // console.log(page, size, query, 'query==>');
  return request.Post(
    `/fdhb-pc/common/pageMedicine`,
    { page, limit: size, keyWord: query?.keyword, ...query },
    { 
      transform(data: any, headers) {
        return {
          data: data.records,
          total: data.total,
        };
      },
    },
  );
}
export function acupointsMethod(page: number, size: number, query?: Record<string, any>) {
  return request.Post(
    `/fdhb-pc/analysisManage/pageAcuPoint`,
    { page, limit: size, keyWord: query?.keyword, ...query },
    {
      transform(data: any, headers) {
        return {
          data: data.records,
          total: data.total,
        };
      },
    },
  );
}
