'use strict';

var tslib_es6 = require('./tslib.es6-2c2ed574.js');
var index = require('./index-3b44943e.js');
var miscCookieHelper = require('./miscCookieHelper.js');
var slugify = require('slugify');
var constantsIsProduction = require('./constantsIsProduction.js');
var formatString = require('string-format');
var React = require('react');
var togetherApiPaths = require('./togetherApiPaths.js');
var constants = require('./constants-762249c4.js');

function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }

var slugify__default = /*#__PURE__*/_interopDefault(slugify);
var formatString__default = /*#__PURE__*/_interopDefault(formatString);
var React__default = /*#__PURE__*/_interopDefault(React);

const DefaultComponentGlobalContextData = {
    locale: 'vi-VN',
    env: {
        isMarryBaby: false,
        togetherBasePath: '/community',
    },
    router: {
        basePath: '',
        asPath: '/',
    },
};
const TogetherComponentGlobalContext = React.createContext({
    data: DefaultComponentGlobalContextData,
    action: {
        pushNotifications: (s) => s,
        sanitizeFunction: (s) => s,
    },
    formatMessage: () => null,
});
exports.GlobalData = DefaultComponentGlobalContextData;
const TogetherComponentGlobalContextProvider = ({ locale = 'vi-VN', children, userInfo, router, env = {
    isMarryBaby: false,
    togetherBasePath: '/community',
}, sanitizeFunction = (s) => s, pushNotifications = () => false, formatMessage, }) => {
    const [togetherUserId, setTogetherUserId] = React.useState();
    exports.GlobalData = {
        userInfo,
        locale,
        togetherUserId,
        router,
        env,
    };
    React.useEffect(() => {
        if (userInfo === null || userInfo === void 0 ? void 0 : userInfo.id) {
            callApiWithAuth(getApiPath(togetherApiPaths.PATHS.PROFILE, {
                _locale: locale,
            }), 'GET').then((res) => {
                var _a;
                setTogetherUserId((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.id);
            });
        }
    }, [userInfo === null || userInfo === void 0 ? void 0 : userInfo.id]);
    return (React__default["default"].createElement(TogetherComponentGlobalContext.Provider, { value: {
            data: {
                userInfo,
                locale,
                togetherUserId,
                router,
                env,
            },
            action: {
                pushNotifications,
                sanitizeFunction,
            },
            formatMessage,
        } }, children));
};

// import { DISCOVER_PATHS, PATHS } from './paths'
// let _apolloClient:ApolloClient<NormalizedCacheObject>
const domainLocales = {
    'vi-VN': 'hellobacsi.com',
    'id-ID': 'hellosehat.com',
    'ms-MY': 'hellodoktor.com',
    'km-KH': 'hellokrupet.com',
    'en-PH': 'hellodoctor.com.ph',
    'th-TH': 'hellokhunmor.com',
    'my-MM': 'hellosayarwon.com',
    'zh-TW': 'helloyishi.com.tw',
    'hi-IN': 'helloswasthya.com',
};
const domainLocalesMarryBaby = {
    'vi-VN': 'marrybaby.vn',
};
const locale = (process.env.NEXT_PUBLIC_DEPLOY_LOCALE ||
    'vi-VN');
const getWebsiteUrlApi = (locale) => {
    const { env: { isMarryBaby }, } = exports.GlobalData;
    return `https://${isMarryBaby ? domainLocalesMarryBaby[locale] : domainLocales[locale]}`;
};
const cleanFormatString = (url) => {
    const qIndex = url.indexOf('?');
    if (qIndex >= 0) {
        return (url.slice(0, qIndex + 1) +
            url
                .slice(qIndex + 1)
                .replace(/[^=&]+=(&|$)/g, '')
                .replace(/&$/, ''));
    }
    return url;
};
const getCurrentBaseUrl = (locale) => {
    const { env: { isMarryBaby }, } = exports.GlobalData;
    if (typeof window !== 'undefined')
        return window.location.origin;
    const isStaging = process.env.NEXT_PUBLIC_DEPLOY_ENV === 'staging';
    const isDev = process.env.NEXT_PUBLIC_DEPLOY_ENV === 'development';
    return isDev
        ? 'http://localhost:3000'
        : `https://${isStaging
            ? isMarryBaby
                ? 'fe.'
                : 'discover.'
            : isMarryBaby
                ? 'www.'
                : ''}${domainLocales[locale]}`;
};
const getCurrentHref = (locale, basePath, asPath) => {
    if (typeof window !== 'undefined')
        return window.location.href;
    return `${getCurrentBaseUrl(locale)}${basePath}${asPath}`;
};
const getApiPath = (path, params, query, baseUrl) => {
    let queryString = '';
    if (query) {
        queryString = Object.keys(query)
            .map((key) => key + '=' + query[key])
            .join('&');
    }
    const { togetherBaseApiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    let formattedPath = formatString__default["default"](path, Object.assign(Object.assign({}, ((params === null || params === void 0 ? void 0 : params._locale)
        ? {
            website_url: getWebsiteUrlApi(String(params._locale)),
        }
        : {})), params));
    formattedPath += `${formattedPath.includes('?') ? '&' : '?'}${queryString}`;
    const baseApiUrl = baseUrl ? baseUrl : togetherBaseApiUrl;
    return baseApiUrl + 'api/v1/' + cleanFormatString(formattedPath);
};
const getDiscoverApiPath = (path, params, useProOnDev) => {
    const { discoverBaseApiUrl = '', discoverBaseProdApiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    const basePath = !constantsIsProduction.isProduction && useProOnDev ? discoverBaseProdApiUrl : discoverBaseApiUrl;
    return (basePath +
        'wp-json/api/' +
        cleanFormatString(formatString__default["default"](path, Object.assign({}, params))));
};
const getMarryBabyApiPath = (path, params, useProOnDev) => {
    const { marryBabyApiUrl = '', marryBabyProdApiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    const basePath = useProOnDev && !constantsIsProduction.isProduction ? marryBabyProdApiUrl : marryBabyApiUrl;
    return (basePath +
        'wp-json/api/' +
        cleanFormatString(formatString__default["default"](path, Object.assign({}, params))));
};
const getCarePath = (path, params) => {
    const { careBaseApiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    return ((careBaseApiUrl || 'https://service-health-care.hellohealthgroup.com/') +
        cleanFormatString(formatString__default["default"](path, Object.assign({}, params))));
};
const getPremiumApiPath = (path, params) => {
    const { premiumBaseApiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    return ((premiumBaseApiUrl ||
        'https://premium-content-stag.hellohealthgroup.com/') +
        cleanFormatString(formatString__default["default"](path, Object.assign({}, params))));
};
const getSsoApiPath = (path, params) => {
    const { publicSSO = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    return ((publicSSO || 'https://staging-id.hellobacsi.com/') +
        'api/' +
        cleanFormatString(formatString__default["default"](path, Object.assign({}, params))));
};
const getChatbotAiApiPath = (path, params) => {
    const { chatbotAiUrl = '' } = (exports.GlobalData === null || exports.GlobalData === void 0 ? void 0 : exports.GlobalData.env) || {};
    return ((chatbotAiUrl || 'https://chatbot-staging-v2.hellohealthgroup.com/') +
        cleanFormatString(formatString__default["default"](path, Object.assign(Object.assign({}, ((params === null || params === void 0 ? void 0 : params._locale)
            ? {
                website_url: getWebsiteUrlApi(String(params._locale)),
            }
            : {})), params))));
};
const fixedEncodeURI = (str) => {
    return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
};
const convertApiOptionsToRequestInit = (opts) => {
    if (opts === null || opts === void 0 ? void 0 : opts.data) {
        if (opts.data instanceof FormData) {
            opts.body = opts.data;
        }
        else if (typeof opts.data === 'object') {
            opts.body = JSON.stringify(opts.data);
        }
        delete opts.data;
    }
    return opts;
};
const callApi = (url, method, options, skipEncodeURI = false) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
    var _a, _b, _c;
    try {
        const res = yield fetch(skipEncodeURI ? url : fixedEncodeURI(url), Object.assign(Object.assign({ method }, convertApiOptionsToRequestInit(options)), { headers: Object.assign({}, options === null || options === void 0 ? void 0 : options.headers) })).then((r) => r.json());
        if (res)
            return res;
    }
    catch (err) {
        console.log(err);
        console.log({
            url,
            status: (_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.status,
            statusText: (_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.statusText,
        });
        // Sentry.captureException(err)
        return ((_c = err === null || err === void 0 ? void 0 : err.response) === null || _c === void 0 ? void 0 : _c.data) || null;
    }
    return null;
});
const callApiWithOptionalAuth = (urlData, method = 'GET', options, reqCookie) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
    var _d, _e, _f, _g, _h, _j;
    try {
        const url = typeof urlData === 'string' ? urlData : urlData.url;
        const backupUrl = typeof urlData === 'string' ? urlData : urlData.backupUrl;
        const parsedCookie = index.cookie.parse(reqCookie || '');
        const token = parsedCookie[constants.BEARER_TOKEN_COOKIE];
        const cookie = token || miscCookieHelper.getCookie(constants.BEARER_TOKEN_COOKIE);
        if (cookie && cookie.length) {
            try {
                const res = yield fetch(url, Object.assign(Object.assign({ method }, convertApiOptionsToRequestInit(options)), { headers: Object.assign({ Authorization: 'Bearer ' + cookie }, options === null || options === void 0 ? void 0 : options.headers) })).then((r) => r.json());
                if ((_d = res === null || res === void 0 ? void 0 : res.messages) === null || _d === void 0 ? void 0 : _d.find((m) => (m === null || m === void 0 ? void 0 : m.toLowerCase()) === 'Unauthenticated')) {
                    return callApi(backupUrl || url, method, options);
                }
                if (res)
                    return res;
            }
            catch (err) {
                console.log({
                    status: (_e = err === null || err === void 0 ? void 0 : err.response) === null || _e === void 0 ? void 0 : _e.status,
                    statusText: (_f = err === null || err === void 0 ? void 0 : err.response) === null || _f === void 0 ? void 0 : _f.statusText,
                });
                // Fallback noauth call
                return callApi(backupUrl || url, method, options);
            }
        }
        else {
            return callApi(backupUrl || url, method, options);
        }
    }
    catch (err) {
        console.log({
            status: (_g = err === null || err === void 0 ? void 0 : err.response) === null || _g === void 0 ? void 0 : _g.status,
            statusText: (_h = err === null || err === void 0 ? void 0 : err.response) === null || _h === void 0 ? void 0 : _h.statusText,
        });
        // Sentry.captureException(err)
        return ((_j = err === null || err === void 0 ? void 0 : err.response) === null || _j === void 0 ? void 0 : _j.data) || null;
    }
    return null;
});
const callApiWithAuth = (url, method, options, reqCookie) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
    try {
        const parsedCookie = index.cookie.parse(reqCookie || '');
        const token = parsedCookie[constants.BEARER_TOKEN_COOKIE];
        const cookie = token || miscCookieHelper.getCookie(constants.BEARER_TOKEN_COOKIE);
        if (cookie && cookie.length) {
            const res = yield fetch(url, Object.assign(Object.assign({ method }, convertApiOptionsToRequestInit(options)), { headers: Object.assign({ Authorization: 'Bearer ' + cookie }, options === null || options === void 0 ? void 0 : options.headers) })).then((r) => r.json());
            if (res)
                return res;
        }
    }
    catch (err) {
        // Sentry.captureException(err)
        return null;
    }
    return null;
});
const callApiWithAdminAuth = (url, method, options, reqCookie) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
    try {
        const parsedCookie = index.cookie.parse(reqCookie || '');
        const token = parsedCookie[constants.BEARER_ADMIN_TOKEN_COOKIE];
        const cookie = token || miscCookieHelper.getCookie(constants.BEARER_ADMIN_TOKEN_COOKIE);
        if (cookie && cookie.length) {
            const res = yield fetch(url, Object.assign(Object.assign({ method }, convertApiOptionsToRequestInit(options)), { headers: Object.assign({ Authorization: 'Bearer ' + cookie }, options === null || options === void 0 ? void 0 : options.headers) })).then((r) => r.json());
            if (res)
                return res;
        }
    }
    catch (err) {
        // Sentry.captureException(err)
        return null;
    }
    return null;
});
function updateQueryStringParameter(uri, key, value) {
    const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
    const separator = uri.indexOf('?') !== -1 ? '&' : '?';
    if (uri.match(re)) {
        return uri.replace(re, '$1' + key + '=' + value + '$2');
    }
    else {
        return uri + separator + key + '=' + value;
    }
}
const getUrlToSSOWithReturnUrl = (url, params) => {
    const { publicSSO } = exports.GlobalData.env;
    const originalRedirectUrl = url || window.location.href;
    // const redirectUrl = new URL(originalRedirectUrl)
    if (params) {
        Object.keys(params).map((k) => {
            updateQueryStringParameter(originalRedirectUrl, k, params[k]);
        });
    }
    updateQueryStringParameter(originalRedirectUrl, 'source', 'communities');
    return publicSSO
        ? `${publicSSO}?returnUrl=${encodeURIComponent(originalRedirectUrl.toString())}`
        : originalRedirectUrl;
};
const getUrlToSignUp = (url, params, togetherBasePath = '/community') => {
    const currentLocation = url || (typeof window !== 'undefined' ? window.location.href : '/');
    let origin = typeof window !== 'undefined' ? window.location.origin : '';
    if (!origin) {
        if (url && (url.startsWith('http://') || url.startsWith('https://'))) {
            origin = url.split('/').slice(0, 3).join('/');
        }
    }
    const onBoardingUrl = `${origin}${togetherBasePath}/on-boarding?return=${encodeURIComponent(currentLocation)}`;
    return getUrlToSSOWithReturnUrl(onBoardingUrl, params);
};
const slugifiedNameWithId = (name, id, slug, _locale) => {
    if (slug && id) {
        return `${slug}-${id}`;
    }
    return `${slugify__default["default"](name || '', {
        lower: true,
        locale: _locale || locale,
    })}-${id}`;
};
const getCareDoctorUrl = ({ name, id, locale, }) => {
    var _a;
    return `/care/${(_a = constants.LOCALISED_SLUGS[locale || 'vi-VN']) === null || _a === void 0 ? void 0 : _a.DOCTOR}/${slugifiedNameWithId(name, id)}`;
};
const getCareHospitalUrl = ({ name, id, slug, locale, }) => {
    var _a;
    return `/care/${(_a = constants.LOCALISED_SLUGS[locale || 'vi-VN']) === null || _a === void 0 ? void 0 : _a.HOSPITAL}/${slugifiedNameWithId(name, id, slug)}`;
};
const getCareHospitalUrlAmp = ({ slug, id, locale, }) => {
    var _a;
    return `/care/${(_a = constants.LOCALISED_SLUGS[locale || 'vi-VN']) === null || _a === void 0 ? void 0 : _a.HOSPITAL}/${slug}-${id}`;
};

exports.DefaultComponentGlobalContextData = DefaultComponentGlobalContextData;
exports.TogetherComponentGlobalContext = TogetherComponentGlobalContext;
exports.TogetherComponentGlobalContextProvider = TogetherComponentGlobalContextProvider;
exports.callApi = callApi;
exports.callApiWithAdminAuth = callApiWithAdminAuth;
exports.callApiWithAuth = callApiWithAuth;
exports.callApiWithOptionalAuth = callApiWithOptionalAuth;
exports.domainLocales = domainLocales;
exports.domainLocalesMarryBaby = domainLocalesMarryBaby;
exports.getApiPath = getApiPath;
exports.getCareDoctorUrl = getCareDoctorUrl;
exports.getCareHospitalUrl = getCareHospitalUrl;
exports.getCareHospitalUrlAmp = getCareHospitalUrlAmp;
exports.getCarePath = getCarePath;
exports.getChatbotAiApiPath = getChatbotAiApiPath;
exports.getCurrentBaseUrl = getCurrentBaseUrl;
exports.getCurrentHref = getCurrentHref;
exports.getDiscoverApiPath = getDiscoverApiPath;
exports.getMarryBabyApiPath = getMarryBabyApiPath;
exports.getPremiumApiPath = getPremiumApiPath;
exports.getSsoApiPath = getSsoApiPath;
exports.getUrlToSSOWithReturnUrl = getUrlToSSOWithReturnUrl;
exports.getUrlToSignUp = getUrlToSignUp;
exports.getWebsiteUrlApi = getWebsiteUrlApi;
exports.locale = locale;
exports.slugifiedNameWithId = slugifiedNameWithId;
exports.updateQueryStringParameter = updateQueryStringParameter;
