'use strict';

const qu = require('../utils/q');
const slugify = require('../utils/slugify');
const capitalize = require('../utils/capitalize');
const { feetInchesToCm } = require('../utils/convert');

function scrapeAll(months, channel, year) {
	return months.map(({ query: queryMonth, el }) => {
		const month = queryMonth.cnt('h3');
		const scenes = queryMonth.all(el.nextElementSibling, 'li:nth-child(2n)');

		return qu.initAll(scenes).map(({ query }) => {
			const release = {};

			release.url = query.url('a.video-pop-up', 'href', { origin: `${channel.url}/submissive` });
			release.entryId = new URL(release.url).searchParams.get('id');

			release.title = query.cnt('.updates-item-title h4');

			release.date = qu.parseDate(`${month} ${year}`, 'MMMM/YYYY');
			release.datePrecision = 'month';

			release.actors = [{
				name: capitalize(query.q('a.video-pop-up', 'data-modelname'), { uncapitalize: true }),
				gender: 'female',
				url: query.url('a.video-pop-up', 'data-modellink', { origin: `${channel.url}/submissive` }),
			}]
				.filter(actor => !/lockdown/i.test(actor.name))
				.concat({
					name: 'Pascal White',
					gender: 'male',
				});

			release.poster = query.img('img');

			return release;
		});
	}).flat();
}

function scrapeScene({ html }, url) {
	const release = {};

	release.entryId = new URL(url).searchParams.get('id');
	release.trailer = html.match(/file: '(.*)'/)[1];

	return release;
}

function scrapeProfile({ query }) {
	const profile = {};

	const bio = query.all('.about-desc li').reduce((acc, el) => {
		const key = query.cnt(el, 'strong');
		const value = query.text(el);

		return {
			...acc,
			[slugify(key, '_')]: value,
		};
	}, {});

	profile.gender = 'female';
	profile.nationality = bio.nationality;
	profile.height = feetInchesToCm(bio.height);
	profile.age = bio.age;
	profile.hair = bio.hair;

	profile.description = query.cnt('.twocolumns');
	profile.avatar = query.img('#individual-description img');

	// no dates or links available
	// profile.releases = scrapeAll(qu.initAll(query.all('.individal-video-item'))); // sic

	return profile;
}

async function fetchLatest(channel, page = 1) {
	const year = new Date().getFullYear() - (page - 1);

	const url = `${channel.url}/submissive/updates.php?y=${year}`;
	const res = await qu.getAll(url, '.month');

	if (res.ok) {
		return scrapeAll(res.items, channel, year);
	}

	return res.status;
}

async function fetchScene(url, channel) {
	const res = await qu.get(url);

	if (res.ok) {
		return scrapeScene(res.item, url, channel);
	}

	return res.status;
}

async function fetchProfile({ name: actorName }, entity, include) {
	const url = `${entity.url}/submissive/subslut-${slugify(actorName)}.php`;
	const res = await qu.get(url, null, null, {
		followRedirects: false,
	});

	if (res.ok && res.status === 200) {
		return scrapeProfile(res.item, actorName, entity, include);
	}

	return res.status;
}

module.exports = {
	fetchLatest,
	fetchScene,
	fetchProfile,
};