import {TrackedObject} from 'tracked-built-ins';
import {timezoneDataWithGMTOffset} from '@tryghost/timezone-data';

export function initialize(applicationInstance) {
    const config = new TrackedObject({});

    Object.defineProperty(config, 'availableTimezones', {
        get() {
            return timezoneDataWithGMTOffset();
        },
        enumerable: true
    });

    Object.defineProperty(config, 'blogDomain', {
        get() {
            const blogDomain = this.blogUrl
                .replace(/^https?:\/\//, '')
                .replace(/\/?$/, '');

            return blogDomain;
        },
        enumerable: true

    });

    Object.defineProperty(config, 'emailDomain', {
        get() {
            const blogDomain = this.blogDomain || '';
            const domainExp = blogDomain.match(new RegExp('^([^/:?#]+)(?:[/:?#]|$)', 'i'));
            const domain = (domainExp && domainExp[1]) || '';
            if (domain.startsWith('www.')) {
                return domain.replace(/^(www)\.(?=[^/]*\..{2,5})/, '');
            }
            return domain;
        },
        enumerable: true
    });

    Object.defineProperty(config, 'getSiteUrl', {
        value: function (path) {
            const siteUrl = new URL(this.blogUrl);
            const subdir = siteUrl.pathname.endsWith('/') ? siteUrl.pathname : `${siteUrl.pathname}/`;
            const fullPath = `${subdir}${path.replace(/^\//, '')}`;

            return `${siteUrl.origin}${fullPath}`;
        }
    });

    applicationInstance.register('config:main', config, {instantiate: false});
}

export default {
    name: 'config',
    initialize
};
