


function getGql (endpoint){
    let headers = {
        'Content-Type': 'application/json;charset=utf-8',
        'Accept': 'application/json'
    }
    


    return async function gql(query, variables={}) {
      if ("authToken" in localStorage) {
        headers.Authorization = "Bearer " + localStorage.authToken
    }
      let result = await fetch(endpoint, {
            method: 'POST',
            headers,
            body: JSON.stringify({
                query,
                variables
            })
        }).then(res => res.json())
        if (("errors" in result) && !("data" in result)) {
            throw new Error(JSON.stringify(result.errors))
        }
        result = Object.values(result.data)[0]


        return result

    }
}
    


    /*Запрос на список корневых категорий
Используем CategoryFind, однако в параметре query используем поиск по полю parent, которое должно быть равно null. (у корневых категорий нет родителя)*/


  const gql = getGql('http://shop-roles.node.ed.asmer.org.ua/graphql')

  
  const gqlRootCats = () => 
    gql(`query baseCategory($searchNullparent: String){
      CategoryFind(query: $searchNullparent){
        _id name parent {
          _id
          name
        }
      }
    }`, {
      searchNullparent: JSON.stringify([{parent: null}])
    })

    //gqlRootCats().then(console.log)


  /*Запрос для получения одной категории с товарами и картинками
Используем CategoryFindOne, передав _id. Попросите GraphQL прислать вам товары из этой категории, а так же подкатегории. Параметр: _id*/


const gqlCategoryGoodsAndSubCategoryGoods = (_id) => 
    gql(`query CategoryGoodsAndSubCategoryGoods($qCategoryId: String) {
      CategoryFindOne(query: $qCategoryId){
        _id
        name
        parent{
          _id
          name
        }
        subCategories{
          _id
          name
          goods{
            _id
            name
          }
        }
        goods{
          _id name price 
          images {
            url
          }
        }
      }
    }`, {
      qCategoryId: JSON.stringify([{ _id }])
    })

    //gqlCategoryGoodsAndSubCategoryGoods("62c94b10b74e1f5f2ec1a0dd").then(console.log)



  /*Запрос на получение товара с описанием и картинками
Аналогично предыдущему запросу, но используем GoodFindOne, так же по _id. Параметр: _id*/

const gqlOneGoodWithDescriptionAndImages = (_id) => 
    gql(`query oneGoodWithDescriptionAndImages($GoodId: String){
      GoodFindOne(query: $GoodId){
        _id
        description
        name
        price
        images{
          url
        }
      }  
    }`, {
        GoodId: JSON.stringify( [{ _id }] )
    })

    //gqlOneGoodWithDescriptionAndImages("62c94990b74e1f5f2ec1a0db").then(console.log)


  /*Запрос на регистрацию
Используется мутация UserUpsert без указания _id пользователя. С указанием _id будет работать редактирование (обновление профиля). Параметры - логин и пароль*/

const gqlUserAdd = (login, password) => 
    gql(`mutation registration($login:String, $password: String){
      UserUpsert(user: {login:$login, password: $password}){
          _id login createdAt
      }
  }`, {
          login,
          password
      }
  )

    //gqlUserAdd("vasya321986320915sf5654755ssddgfg", "пороль").then(console.log)


/*Запрос на логин
query login. В ответ приходит токен. Пригодится для залогинивания через authReducer. Параметры: логин и пароль.*/

const gqllogin = (login, password) => 
    gql(`query login($login:String, $password:String){
      login(login:$login, password:$password)
  }`, {
          login,
          password
      }
  )

 // gqllogin("vasya321986320915sf5654755ssddgfg", "пороль").then(x => {console.log(x)
 //   localStorage.authToken = x})



/*Запрос истории заказов
OrderFind. По умолчанию возвращает все ваши заказы (но не чужие). Если вы аноним - то и заказов у вас нет;*/

const gqlOrderFind = () => 
    gql(`query {
        OrderFind(query: "[{}]") {
            _id
            createdAt
            total
        }
    }`, 
  )

  //gqlOrderFind().then(console.log)


/*Запрос оформления заказа
Мутация OrderUpsert с массивом orderGoods, в которых есть объект good с единственным полем - _id, а также count. Используя этот запросы мы будем передавать информацию из cartReducer на сервер для оформления заказа. Параметр: массив orderGoods с элементами вида {good: {_id}, count}. Параметров нет, так как thunk может прочитать состояние редьюсера корзины используя передаваемый в него getState. После успешного оформления заказа на бэке задиспатчить экшон очистки корзины;*/

  //version2

const OrderUpsert2 = (arrGoods) => 
    gql(`mutation ($arrGoods: [OrderGoodInput]){
      OrderUpsert(order: {orderGoods: $arrGoods}) {
        _id, total, orderGoods {
          good {
            name
          }
        }
      }
    }`, {
      arrGoods 
  }
  )

