'use strict';

/**
 * @description Vuex - {{items.title}}
 * @module @/store/{{model}}
 * @author coder
 */
import {
  {{each items.value}}
  {{$value['fnName']}},
  {{/each}}
} from '@/api/{{items.name}}';
const {isOpenNoResultKey} = require('./../../../settings');

/**
 * @description types常量
 * const
 */
import {
  {{each items.value}}
    {{$value['key']}},
  {{/each}}
} from '@/store/types';

//设置请求拦截
{{set isCache = false}}
{{each items.value}}
  {{if $value['state']}}
    let {{$value['state']}}Flag = false;
    {{set isCache = true}}
  {{/if}}
{{/each}}
import {setVuexCache} from "@/utils/xd.base";

/**
 * @description 状态保存对象
 */
const state = {
  {{each items.value}}
    {{if $value['state']}}
      {{$value['state']}}: null,
    {{/if}}
  {{/each}}
};

/**
 * @description 状态更新对象
 */
const mutations = {
  {{each items.value}}
    {{if $value['state']}}
      [{{$value.key}}](state, payload) {
        state.{{$value['state']}} = payload
      },
    {{/if}}
  {{/each}}
};

/**
 * @description 状态获取对象
 */
const getters = {
  {{each items.value}}
      {{if $value['state']}}
        [{{$value.key}}](state) {
         return state.{{$value['state']}}
        },
      {{/if}}
    {{/each}}
};



/**
 * @description 状态接受对象
 */
const actions = {
  {{each items.value}}
    {{set params = ', params'}}
    {{set inParams = 'params'}}
    {{set store = '{commit, state, getters, dispatch}'}}
    {{set paramsData = $value.data }}

    {{if $value.method === 'get'}}
      {{set paramsData = $value.params }}
    {{/if}}

    {{if !$value.isParams}}
      {{set params = '' }}
      {{set inParams = ''}}
      {{set paramsData = {} }}
    {{/if}}

    {{if !$value['state'] && !$value.isParams}}
      {{set store = '' }}
    {{/if}}



    /**
     * @description {{items.title}} - {{$value.title}}
     {{if $value.isParams}}
        * @param commit
        * @param state
        * @param getters
        * @param dispatch
        * @param params { Object }
        {{each paramsData }}
          * @param params.{{$index}}  { {{@ $value[1]}} }   {{$value[0]}}   ({{$value[2]}}）  {{if $value[3]}}默认值：{{$value[3]}}{{/if}}
        {{/each}}
        {{if $value.isCallback}}
          * @param params.{{ $value.isCallback}} {Function} 回调函数 (必填）
        {{/if}}
     {{/if}}
     * @returns { Promise|* }
     **/
    {{$value.fnName}}({{store}}{{params || fnParams }}) {
      {{if params && $value.isCallback}}
        /**判断是否有回调函数并保存**/
        let callback;
        if (typeof params.{{$value.isCallback}} === 'function') {
          callback = new Function('return ' + params.{{$value.isCallback}}.toString())();;
          delete params.{{$value.isCallback}}
        }
      {{/if}}


      {{if $value['state']}}
        //强制刷新
        if(params && params['@update']) {
          {{$value['state']}}Flag = false;
          delete params['@update'];
        }
        //启动vuex缓存
        if({{$value['state']}}Flag) {
          return setVuexCache(state, '{{$value['state']}}')
        }

        //接口获取
        {{$value['state']}}Flag = true;
      {{/if}}

      {{if $value.methodKey === 'delete' || $value.methodKey === 'get'}}
      let toString = Object.prototype.toString;
      if(toString.call(params) === '[object String]'
        || toString.call(params) === '[object Number]'
      ){
        params = {id:params};
      }
      {{/if}}

      return new Promise((resolve, reject) => {
         {{$value.fnName}}({{inParams}})
          .then(res => {

            {{if $value.resultKey}}
              res = (res.{{$value.resultKey}} && (res.code || res.msg)) ? res.{{$value.resultKey}} : res;
            {{/if}}

            {{if $value['isConsole']}}
              console.log('{{$value.fnName}}',res);
            {{/if}}

            {{if params && $value.isCallback}}
              /**执行回调函数**/
              if (typeof callback === 'function') {
                callback({commit, state, getters, dispatch,resolve,reject,result: res },()=>{
                  resolve(res)
                });
              }
            {{else}}
              {{if $value['state']}}
                {{if $value['stateAppend']}}
                  let stateData = JSON.stringify(state["{{$value['state']}}"]).concat(res)
                  commit('{{$value.key}}', stateData)
                {{else}}
                  commit('{{$value.key}}', res)
                {{/if}}
              {{/if}}
              if(isOpenNoResultKey) res = {data: res};
              resolve(res)
            {{/if}}
          })
          .catch(error => {
            console.error(error)
            reject(error);
          });
      })
    },
  {{/each}}

};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
};
