// script.js

import { Element } from './element.js';

const scrapeIMDbData = () => {
	const title = document.querySelector('h1').innerText.trim();
	const directorElement = document.querySelector('a[href^="/name/"]');
	const director = directorElement ? directorElement.innerText.trim() : null;
	const yearElement = document.querySelectorAll('a[href*="/releaseinfo"]')[0];
	const year = yearElement ? yearElement.innerText.trim() : null;
	const coverImageElement = document.querySelectorAll('img.ipc-image')[0];
	const coverImageUrl = coverImageElement ? coverImageElement.src : null;
	return {
		'title': title,
		'author': director,
		'year': year,
		'image_src': coverImageUrl,
		'type': 'movie'
	};
}

const scrapeGoodReads = () => {
	const title = document.querySelector('h1').innerText.trim();
	const author = document.querySelector('span.ContributorLink__name').innerText.trim();
	const yearElement = document.querySelector('p[data-testid="publicationInfo"]');
	const year = yearElement ? yearElement.innerText.trim().split(', ')[1] : null;
	const coverImageElement = document.querySelector('.BookCover img');
	const coverImageUrl = coverImageElement ? coverImageElement.src : null;
	return {
		'title': title,
		'author': author,
		'year': year,
		'image_src': coverImageUrl,
		'type': 'book'
	};
}

const scrapeRymData = () => {
	const title = document.querySelector('.album_title').innerText.trim();
	const author = document.querySelector('a.artist').innerText.trim();
	const yearElement = document.querySelector('a[href^="/charts/top/"]');
	const year = yearElement ? yearElement.innerText.trim() : null;
	const coverImageElement = document.querySelector('div[class^="coverart_"] > img');
	const coverImageUrl = coverImageElement ? coverImageElement.src : null;
	const spotifyElement = document.querySelector('a[title="Spotify"]');
	const spotifyUrl = spotifyElement ? spotifyElement.href : null;
	return {
		'title': title,
		'author': author,
		'year': year,
		'image_src': coverImageUrl,
		'spotify_url': spotifyUrl,
		'type': 'album'
	};
}



const medias = [
	{'name': 'movie', 'urlPattern': /https:\/\/www.imdb.com\/title\/.*\/?/, 'scrapeFunction': scrapeIMDbData},
	{'name': 'book', 'urlPattern': /https:\/\/www.goodreads.com\/book\/show\/.*/, 'scrapeFunction': scrapeGoodReads},
	{'name': 'album', 'urlPattern': /https:\/\/rateyourmusic.com\/release\/.*/, 'scrapeFunction': scrapeRymData}
]

const body = new Element(document.body)
	.addClass(
		'bg-slate-900',
		'text-slate-500',
		'flex',
		'flex-col',
		'items-center',
		'justify-center',
		'w-screen',
		'h-screen',
	);

chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
	const tab = tabs[0];
	const url = tab.url
	console.log('URL:', url);
	for (let i = 0; i < medias.length; i++) {
		const media = medias[i];
		if (url.match(media.urlPattern)) {
			chrome.scripting.executeScript({
				target: { tabId: tab.id },
				function: media.scrapeFunction
			}, (results) => {
				const data = results[0].result;
				console.log({data});

				const row = new Element('div')  // {{{
					.appendTo(body)
					.addClass(
						'flex',
						'flex-row',
						'justify-between',
						'w-full',
					)

				const image = new Element('img')  // {{{
					.addClass(
						'h-32',
						'w-auto',
						'p-2',
						'object-contain',
					)
					.setAttribute('src', data.image_src)
					.appendTo(row);

				// }}}

				const col = new Element('div')  // {{{
					.appendTo(row)
					.addClass(
						'flex',
						'flex-col',
						'justify-center',
						'items-center',
						'p-2',
						'gap-1',
						'text-center'

					)

				// }}}

				const title = new Element('input')  // {{{
					.setAttribute('type', 'text')
					.setAttribute('value', data.title)
					.setId('title')
					.addClass(
						'text-slate-200',
						'font-bold',
						'bg-slate-900',
						'text-center',

					)
					.setText(data.title)
					.appendTo(col);

				// }}}

				const author = new Element('input')  // {{{
					.addClass(
						'bg-slate-900',
						'text-center',
					)
					.setAttribute('type', 'text')
					.setAttribute('value', data.author)
					.setId('author')
					.setText(data.author)
					.appendTo(col);

				// }}}

				const year = new Element('input')  // {{{
					.addClass(
						'bg-slate-900',
						'text-center',
					)
					.setAttribute('type', 'text')
					.setAttribute('value', data.year)
					.setId('year')
					.setText(data.year)
					.appendTo(col);

				// }}}
				
				if (media.name === 'movie') {
					const typeDiv = new Element('div')
						.addClass(
							'flex',
							'flex-row',
							'justify-center',
							'gap-2',
						)
						.appendTo(col);
					const tvRadio = new Element('input')
						.setAttribute('type', 'radio')
						.setAttribute('name', 'type')
						.setAttribute('value', 'tv')
						.appendTo(typeDiv);
					const tvLabel = new Element('label')
						.setText('TV')
						.appendTo(typeDiv);
					const movieRadio = new Element('input')
						.setAttribute('type', 'radio')
						.setAttribute('name', 'type')
						.setAttribute('value', 'movie')
						.setAttribute('checked', 'checked')
						.appendTo(typeDiv);
					const movieLabel = new Element('label')
						.setText('Movie')
						.appendTo(typeDiv);
				}

				const saveButton = new Element('span')  // {{{
					.addClass(
						'text-slate-900',
						'rounded',
						'px-2',
						'bg-slate-500',
					)
					.setText('Checking...')
					.appendTo(col);

				// }}}

				chrome.runtime.sendMessage({ action: 'checkMedia', data, url: url}, (response) => {
					if (response.success) {
						if (response.responseData.exists) {
							saveButton
								.setText('Saved!')
								.addClass('bg-green-600')
								.removeClass(
									'hover:bg-slate-400',
									'bg-slate-500',
									'cursor-pointer',
								);
						} else {
							saveButton
								.setText('Save')
								.addClass(
									'bg-slate-500',
									'hover:bg-slate-400',
									'cursor-pointer',
								)
								.addEventListener('click', () => {
									const messageData = {
										'title': title.element.value,
										'author': author.element.value,
										'year': year.element.value,
										'image_src': data.image_src,
										'type': data.type,
									};
									if (media.name === 'movie') {
										messageData.type = document.querySelector('input[name="type"]:checked').value;
										if (messageData.type === 'tv') {
											messageData.author = null;
										}
									}
									if (media.name === 'album') {
										if (data.spotify_url) {
											messageData.spotify_url = data.spotify_url;
										}
									}
									console.log({messageData});
									chrome.runtime.sendMessage({ action: 'saveMedia', data: messageData, url: url}, (response) => {
										console.log('Background response:', response);
										if (response.success) {
											saveButton.setText('Saved!').
												addClass('bg-green-600').
												removeClass(
													'hover:bg-slate-400',
													'bg-slate-500',
													'cursor-pointer',
												);
										} else {
											saveButton.setText('Error!').
												addClass('bg-red-500').
												removeClass(
													'hover:bg-slate-400',
													'bg-slate-500',
													'cursor-pointer',
												);
										}
									});
								})
						}
					} else {
						saveButton.setText('Error!').addClass('bg-red-500').removeClass('hover:bg-slate-400');
					}
				});
			});
			return;
		}
	}
	console.log('No match');
	new Element('div')
		.appendTo(body)
		.addClass(
			'flex',
			'flex-row',
			'justify-center',
			'w-full',
		)
		.appendChild(
			new Element('span')
				.setText('No match')
		);

});