import config from 'config';

async function get(endpoint, query = {}) {
    const curatedQuery = Object.entries(query).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}); // remove empty values
    const q = new URLSearchParams(curatedQuery).toString();

    const res = await fetch(`${config.api.url}${endpoint}?${q}`, {
        method: 'GET',
        mode: 'cors',
        credentials: 'same-origin',
    });

    if (res.ok) {
        return res.json();
    }

    const errorMsg = await res.text();

    throw new Error(errorMsg);
}

async function post(endpoint, data) {
    const res = await fetch(`${config.api.url}${endpoint}`, {
        method: 'POST',
        mode: 'cors',
        headers: {
            'Content-Type': 'application/json',
        },
        credentials: 'same-origin',
        body: JSON.stringify(data),
    });

    if (res.ok) {
        return res.json();
    }

    const errorMsg = await res.text();

    throw new Error(errorMsg);
}

async function graphql(query, variables = null) {
    const res = await fetch('/graphql', {
        method: 'POST',
        mode: 'cors',
        headers: {
            'Content-Type': 'application/json',
        },
        credentials: 'same-origin',
        body: JSON.stringify({
            query,
            variables,
        }),
    });

    if (res.ok) {
        const { data } = await res.json();

        return data;
    }

    const errorMsg = await res.text();

    throw new Error(errorMsg);
}

export {
    get,
    post,
    graphql,
};