const ADD_VISITED_VIEWS = 'ADD_VISITED_VIEWS';
const DEL_VISITED_VIEWS = 'DEL_VISITED_VIEWS';
const DEL_OTHERS_VIEWS = 'DEL_OTHERS_VIEWS';
const DEL_ALL_VIEWS = 'DEL_ALL_VIEWS';

const state = {
  visitedViews: [],
  cachedViews: [],
};

const getters = {
  visitedViews: state => state.visitedViews,
  cachedViews: state => state.cachedViews,
};

const actions = {
  addVisitedViews({ commit }, view) {
    commit(ADD_VISITED_VIEWS, view);
  },
  delVisitedViews({ commit, state }, view) {
    return new Promise(resolve => {
      commit(DEL_VISITED_VIEWS, view);
      resolve([...state.visitedViews]);
    });
  },
  delOthersViews({ commit, state }, view) {
    return new Promise(resolve => {
      commit(DEL_OTHERS_VIEWS, view);
      resolve([...state.visitedViews]);
    });
  },
  delAllViews({ commit, state }) {
    return new Promise(resolve => {
      commit(DEL_ALL_VIEWS);
      resolve([...state.visitedViews]);
    });
  },
};

const mutations = {
  [ADD_VISITED_VIEWS]: (state, view) => {
    if (state.visitedViews.some(v => v.path === view.path)) return;
    state.visitedViews.push({
      name: view.name,
      path: view.path,
      title: view.meta.title || 'no-name',
      store: view.meta.store || null,
    });
    if (!view.meta.noCache) {
      state.cachedViews.push(view.name);
    }
  },
  [DEL_VISITED_VIEWS]: (state, view) => {
    for (const [i, v] of state.visitedViews.entries()) {
      if (v.path === view.path) {
        state.visitedViews.splice(i, 1);
        break;
      }
    }
    for (const i of state.cachedViews) {
      if (i === view.name) {
        const index = state.cachedViews.indexOf(i);
        state.cachedViews.splice(index, 1);
        break;
      }
    }
  },
  [DEL_OTHERS_VIEWS]: (state, view) => {
    for (const [i, v] of state.visitedViews.entries()) {
      if (v.path === view.path) {
        state.visitedViews = state.visitedViews.slice(i, i + 1);
        break;
      }
    }
    for (const i of state.cachedViews) {
      if (i === view.name) {
        const index = state.cachedViews.indexOf(i);
        state.cachedViews = state.cachedViews.slice(index, i + 1);
        break;
      }
    }
  },
  [DEL_ALL_VIEWS]: state => {
    state.visitedViews = [];
    state.cachedViews = [];
  },
};

export default {
  state,
  getters,
  actions,
  mutations,
};
