import Vue from 'vue'
import Vuex from 'vuex'

import { createStore } from 'vuex-extensions'

// import { JSONAPI } from 'vuejs/api/json-axios'
// import qs from 'querystring-es3'

import { MGQ } from 'vuejs/api/graphql-axios'
import { print } from 'graphql/language/printer'
import gql from 'graphql-tag'
// import materiauFields from 'vuejs/api/gql/materiau.fragment.gql'

import Common from './modules/common'
import User from './modules/user'
import Search from './modules/search'
import Blabla from './modules/blabla'
import Showrooms from './modules/showrooms'
import Pages from './modules/pages'

// https://github.com/vuejs/vuex/tree/dev/examples/shopping-cart

Vue.use(Vuex)
// export default new Vuex.Store({
export default createStore(Vuex.Store, {
  modules: {
    Common,
    User,
    Search,
    Blabla,
    Showrooms,
    Pages
  },
  // https://github.com/huybuidac/vuex-extensions
  mixins: {
    actions: {
      loadMaterialsGQL ({ dispatch }, { ids, gqlfragment, callBack, callBackArgs }) {
        console.log('loadMaterialsGQL ids', ids)

        const ast = gql`{
          materiaux(ids: [${ids}]) {
            ...MateriauFields
          }
        }
        ${gqlfragment}
        `
        MGQ.post('', { query: print(ast) })
          .then((resp) => {
            console.log('loadMaterialsGQL resp', resp)
            // dispatch('parseMaterialsGQL', {
            //   items: resp.data.data.materiaux,
            //   callBack: callBack,
            //   callBackArgs: callBackArgs
            // })
            dispatch(callBack, {
              items: resp.data.data.materiaux,
              callBackArgs: callBackArgs
            })
          })
          .catch(error => {
            console.warn('Issue with loadMaterials', error)
            Promise.reject(error)
          })
      }
      // parseMaterialsGQL ({ dispatch }, { items, callBack, callBackArgs }) {
      //   dispatch(callBack, { items: items, callBackArgs: callBackArgs })
      // }
      // loadMaterials ({ dispatch }, { uuids, imgStyle, callBack, callBackArgs }) {
      //   const params = {
      //     // include: 'images', // no needs to include thanks to consumers_image_styles module
      //     // include: 'drupal_internal__nid',
      //     'filter[uuids-groupe][group][conjunction]': 'OR'
      //   }
      //   for (let i = 0; i < uuids.length; i++) {
      //     const uuid = uuids[i]
      //     params[`filter[${uuid}][condition][path]`] = 'id'
      //     params[`filter[${uuid}][condition][value]`] = uuid
      //     params[`filter[${uuid}][condition][operator]`] = '='
      //     params[`filter[${uuid}][condition][memberOf]`] = 'uuids-groupe'
      //   }
      //   // console.log('search JSONAPI params', params)
      //   const q = qs.stringify(params)
      //   return JSONAPI.get('node/materiau?' + q)
      //     .then(({ data }) => {
      //       console.log('mixin getMaterials data', data)
      //       dispatch('parseMaterials', { data: data.data, uuids: uuids, imgStyle: imgStyle, callBack: callBack, callBackArgs: callBackArgs })
      //       // commit('setItems', data.items)
      //     })
      //     .catch((error) => {
      //       console.warn('Issue with getItems', error)
      //       Promise.reject(error)
      //     })
      // },
      // parseMaterials ({ dispatch }, { data, uuids, imgStyle, callBack, callBackArgs }) {
      //   // data comes from jsonapi query
      //   // uuids comes from original query (solr, FlagCollection, etc)
      //   // so we loop from uuids to conserve the original order
      //   console.log('mixin parseMaterials', data, uuids, callBack, callBackArgs)
      //   const items = []
      //   // for (let i = 0; i < data.length; i++) {
      //   for (let i = 0; i < uuids.length; i++) {
      //     const uuid = uuids[i]
      //     // https://stackoverflow.com/questions/11258077/how-to-find-index-of-an-object-by-key-and-value-in-an-javascript-array
      //     const item_index = data.findIndex(p => p.id === uuid)
      //     // console.log('item_index', item_index)
      //     if (item_index === -1) continue
      //
      //     const item_src = data[item_index]
      //     const attrs = item_src.attributes
      //     const relations = item_src.relationships
      //
      //     // get field values
      //     const item = {
      //       uuid: uuid,
      //       title: attrs.title,
      //       field_short_description: attrs.field_short_description,
      //       body: attrs.body,
      //       field_reference: attrs.field_reference
      //     }
      //
      //     // get images included values
      //     const img_src = relations.images.data
      //     // console.log('img_src', img_src)
      //     // this is a temporary deactivation of images
      //     // img_src = [];
      //     item.images = []
      //     for (let j = 0; j < img_src.length; j++) {
      //       if (img_src[j].meta.imageDerivatives) {
      //         let img_styles = {}
      //         for (let k = 0; k < imgStyle.length; k++) {
      //           img_styles[imgStyle[k]] = img_src[j].meta.imageDerivatives.links.[imgStyle[k]].href
      //         }
      //         item.images.push({
      //           title: img_src[j].meta.title,
      //           src: img_src[j].meta.imageDerivatives.links.hd.href,
      //           // meta.imageDerivatives.style.href link is provided by drupal consumers_image_styles module
      //           // BUG: missing all image derivative but first
      //           img_styles: img_styles
      //         })
      //       } else {
      //         console.warn('missing image derivative ' + j + '/' + img_src.length + ' for ' + attrs.title)
      //       }
      //     }
      //
      //     items.push(item)
      //   }
      //   console.log('items', items)
      //   dispatch(callBack, { items: items, callBackArgs: callBackArgs })
      // }
    }
  }
})