'use strict';

const config = require('config');
const path = require('path');
const url = require('url');
const dateFns = require('date-fns');
const mime = require('mime-types');

function interpolate(pattern, user, post, item) {
    const dateFormat = config.library.dateFormat || 'YYYYMMDD';

    const vars = {
        $base: config.library.base
    };

    if(user) {
        Object.assign(vars, {
            $user: user.name,
            $username: user.name,
            $userId: user.id,
            $userCreated: dateFns.format(user.created, dateFormat),
            $userVerified: user.verified ? config.library.booleans.verified : '',
            $userVerifiedEmail: user.verifiedEmail ? config.library.booleans.verifiedEmail : '',
            $userGold: user.gold ? config.library.booleans.gold : '',
        });

        if(user.profile) {
            Object.assign(vars, {
                $profileId: user.profile.id,
                $profileTitle: user.profile.title,
                $profileDescription: user.profile.description,
                $profileOver18: user.profile.over18 ? config.library.booleans.over18 : ''
            });
        }
    }

    if(post) {
        Object.assign(vars, {
            $postId: post.id,
            $postTitle: (post.title || '').slice(0, config.library.titleLength),
            $postUser: post.user,
            $postDate: dateFns.format(post.datetime, dateFormat),
            $postIndex: post.index + config.library.indexOffset,
            $subreddit: post.subreddit,
            $host: post.host.label
        });

        if(post.content.album) {
            Object.assign(vars, {
                $albumId: post.content.album.id,
                $albumTitle: (post.content.album.title || '').slice(0, config.library.titleLength),
                $albumDescription: post.content.album.description,
                $albumDate: dateFns.format(post.content.album.datetime, dateFormat)
            });
        }
    }

    if(item) {
        Object.assign(vars, {
            $itemId: item.id,
            $itemTitle: (item.title || '').slice(0, config.library.titleLength),
            $itemDescription: item.description,
            $itemDate: dateFns.format(item.datetime, dateFormat),
            $itemIndex: item.index + config.library.indexOffset,
            $extracted: item.extracted ? config.library.booleans.extracted : '',
            $preview: item.preview ? config.library.booleans.preview : '',
            $ext: `.${mime.extension(item.type) || path.extname(url.parse(item.url).pathname)}`
        });
    }

    return Object.entries(vars).reduce((acc, [key, value], index) =>  {
        // substitute slashes for filesystem compatability
        if(key !== '$base') {
            value = (value || '').toString().replace(/\//g, config.library.slashSubstitute);
        }

        return acc.replace(key, value);
    }, pattern);
};

module.exports = interpolate;