import fetch from 'fetch';
import oembedProviders from './oembed-providers';
import {Promise} from 'rsvp';

let filteredProviders;

// normalize the oembed.com providers list
// implemented as a memoized function rather than direct map to avoid parsing
// cost during initial JS load/parse.
export default function providers() {
    if (filteredProviders) {
        return filteredProviders;
    }

    filteredProviders = oembedProviders().map((provider) => {
        let {
            provider_name, // eslint-disable-line camelcase
            provider_url, // eslint-disable-line camelcase
            endpoints
        } = provider;

        let [endpoint] = endpoints;
        let {
            schemes = [],
            url
        } = endpoint;

        let hostname = new URL(url).hostname;
        let domain = hostname ? hostname.replace('www.', '') : '';

        return {
            provider_name,
            provider_url,
            schemes,
            domain,
            url
        };
    }).filter(provider => provider.domain !== '');

    return filteredProviders;
}

export function findProvider(url) {
    let candidates = providers().filter((provider) => {
        let {
            schemes,
            domain
        } = provider;

        if (!schemes.length) {
            return url.includes(domain);
        }

        return schemes.some((scheme) => {
            let reg = new RegExp(scheme.replace(/\*/g, '(.*)'), 'i');
            return url.match(reg);
        });
    });

    return candidates.length > 0 ? candidates[0] : null;
}

export function fetchEmbed(url, provider) {
    return new Promise((resolve, reject) => {
        let {
            provider_name, // eslint-disable-line camelcase
            provider_url, // eslint-disable-line camelcase
            url: resourceUrl
        } = provider;

        let link = `${resourceUrl}?format=json&url=${encodeURIComponent(url)}`;

        return fetch(link, {cache: 'no-cache', method: 'cors'}).then(res => res.json()).then((json) => {
            json.provider_name = provider_name; // eslint-disable-line camelcase
            json.provider_url = provider_url; // eslint-disable-line camelcase
            return resolve(json);
        }).catch(error => reject(error));
    });
}
