const Manifest = chrome.runtime.getManifest();
const SettingsURL = chrome.runtime.getURL('settings.html');

const DefaultSettings = {
	PinnedGamesOn: true,
	ForumMentsOn: true,
	BestFriendsOn: false,
	ImprovedFrListsOn: false,
	IRLPriceWithCurrency: {
		Enabled: true,
		Currency: 0,
		Package: 0
	},
	IRLPriceWithCurrencyOn: true,
	IRLPriceWithCurrencyCurrency: 0,
	IRLPriceWithCurrencyPackage: 0,
	HideNotifBadgesOn: false,
	StoreOwnTagOn: true,
	ThemeCreatorOn: false,
	ThemeCreator: {
		Enabled: false,
		BGColor: null,
		BGImage: null,
		BGImageSize: 'fit',
		PrimaryTextColor: null,
		SecondaryTextColor: null,
		LinkTextColor: null,
		WebsiteLogo: null
	},
	ModifyNavOn: false,
	ModifyNav: [
		{
			Label: 'Places',
			Link: 'https://polytoria.com/places'
		},
		{
			Label: 'Store',
			Link: 'https://polytoria.com/store'
		},
		{
			Label: 'Guilds',
			Link: 'https://polytoria.com/guilds'
		},
		{
			Label: 'People',
			Link: 'https://polytoria.com/users'
		},
		{
			Label: 'Forum',
			Link: 'https://polytoria.com/forum'
		}
	],
	MoreSearchFiltersOn: true,
	ApplyMembershipTheme: {
		Enabled: false,
		Theme: 0
	},
	ApplyMembershipThemeOn: false,
	ApplyMembershipThemeTheme: 0,
	MultiCancelOutTradesOn: true,
	ItemWishlistOn: true,
	HideUpgradeBtnOn: false,
	TryOnItemsOn: true,
	OutfitCostOn: true,
	ShowPlaceRevenueOn: true,
	ReplaceItemSalesOn: false,
	HoardersListOn: true,
	HoardersList: {
		Enabled: true,
		AvatarsEnabled: false,
		MinCopies: 2
	},
	LibraryDownloadsOn: true,
	EventItemsCatOn: true,
	HomeFriendCountOn: true,
	HideUserAds: {
		Enabled: false,
		Banners: true,
		Rectangles: true
	},
	UploadMultipleDecals: true,
	GD_ServerBalanceOn: true,
	AvatarDimensionToggleOn: true,
	TheGreatDivide: {
		Enabled: true,
		UnbalancedIndicatorOn: true,
		MVPUserIndicatorOn: true,
		UserStatsOn: true,
		LeaderboardsOn: true
	},
	CollectibleInventoryCatOn: true,
	ShowValueListDataOn: true,
	ImprovedAchievements: {
		Enabled: true,
		ProgressBarOn: true,
		PercentageOn: true,
		OpacityOn: true
	},
	ReaddCopyablePlacesOn: true,
	TimePlayedOn: true,
	HomeJoinFriendsButtonOn: true
}

// ON EXTENSION INSTALL / RELOAD
chrome.runtime.onInstalled.addListener(() => {
	chrome.storage.sync.get(['PolyPlus_Settings'], function(result){
		const MergedSettings = MergeObjects((result.PolyPlus_Settings || DefaultSettings), DefaultSettings)
		chrome.storage.sync.set({'PolyPlus_Settings': MergedSettings}, function(){
			console.log('Successfully merged settings')
		})
	})
});

let RecordingTimePlayed = false
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
	if (request.action === 'reload') {
		chrome.runtime.reload();
	} else if (request.action === 'start_time_played') {
		if (RecordingTimePlayed === true) {
			console.log('Time Played: Already Started Interval')
			return
		}
		RecordingTimePlayed = true

		chrome.storage.sync.get(['PolyPlus_TimePlayed'], function(result){
			console.log('Time Played: Start Interval')

			const Playtime = result.PolyPlus_TimePlayed || {
				[request.placeID]: 0
			};
			let LoadedIn = false
			const TimePlayedInterval = setInterval(async () => {
				console.log('Time Played: Run Check')
				const PlaceStatus = (await (await fetch('https://api.polytoria.com/v1/users/' + request.userID)).json()).playing

				if (PlaceStatus === null) {
					console.log('Time Played: Not Playing Anything')
					if (LoadedIn === true) {
						console.log('Time Played: End Interval')
						clearInterval(TimePlayedInterval)
					}
				} else {
					LoadedIn = true
					if (!Playtime[PlaceStatus.placeID]) {
						Playtime[PlaceStatus.placeID] = 0
					}
					Playtime[PlaceStatus.placeID] += 5
					console.log('Time Played: Time Increase: ', new Date(Playtime[PlaceStatus.placeID] * 1000).toISOString().slice(11, 19), PlaceStatus)
					chrome.storage.sync.set({'PolyPlus_TimePlayed': Playtime}, function(){
						console.log('Time Played: Saved Playtime')
					})
				}
			}, 5000);
		})
	}
});

// WHEN CLICKING ON EXTENSION ICON OPEN THE SETTINGS PAGE
chrome.action.onClicked.addListener((tab) => {
	chrome.tabs.create({active: true, url: SettingsURL});
});

// REGISTER AN ALARM FOR DAILY UPDATE CHECK
chrome.alarms.create('PolyPlus-UpdateCheck', {
	when: Date.now() + GetNext12PM()
});

function GetNext12PM() {
	const Now = new Date();
	const Next = new Date();
	Next.setHours(12, 0, 0, 0);
	if (Now.getHours() >= 12) {
		Next.setDate(Next.getDate() + 1);
	}
	return Next - Now;
}

// HANDLE ALARMS FIRING
/*
chrome.alarms.onAlarm.addListener(function (alarm) {
	if (alarm.name === 'PolyPlus-UpdateCheck') {
		RunUpdateNotifier();
	}
});
*/
function RunUpdateNotifier() {
	chrome.storage.local.get(['PolyPlus_LiveVersion', 'PolyPlus_OutOfDate', 'PolyPlus_SkipUpdate'], function (result) {
		const OutOfDate = result.PolyPlus_OutOfDate || false;
		const SkipUpdate = result.PolyPlus_SkipUpdate || null;
		const LiveVersion = result.PolyPlus_LiveVersion || Manifest.version;
		if (OutOfDate !== true && SkipUpdate !== LiveVersion) {
			fetch('https://polyplus.vercel.app/data/version.json')
				.then((response) => {
					if (!response.ok) {
						throw new Error('Network not ok');
					}
					return response.json();
				})
				.then((data) => {
					chrome.storage.local.set({PolyPlus_LiveVersion: data.version}, function () {
						console.log('Cached live version');
					});
					if (data.version > Manifest.version) {
						chrome.storage.local.set({PolyPlus_OutOfDate: true, PolyPlus_ReleaseNotes: data.releaseNotes}, function () {
							console.log('Cached update notifier result');
						});
						chrome.notifications.create(
							'',
							{
								type: 'basic',
								iconUrl: chrome.runtime.getURL('icon.png'),
								title: 'New Update Available',
								message: 'A new update is available for Poly+! (v' + data.version + ')'
							},
							function (notificationID) {
								chrome.notifications.onClicked.addListener(function (id) {
									if (id === notificationID) {
										chrome.tabs.create({url: 'https://github.com/IndexingGitHub/PolyPlus/releases', active: true});
										chrome.notifications.clear(notificationID);
									}
								});
							}
						);
					}
				})
				.catch((error) => {
					console.log(error);
				});
		}
	});
}

chrome.contextMenus.removeAll(function () {
	chrome.contextMenus.create({
		title: 'Run Update Notifier',
		id: 'PolyPlus-RunUpdateNotifier',
		contexts: ['all'],
		documentUrlPatterns: [
			'https://polytoria.com/my/settings/polyplus*'
		]
	});

	// COPY ASSET ID CONTEXT MENU ITEM REGISTRATION
	/*
	const AssetTypes = ["Place", "User", "Item", "Guild"]
	AssetTypes.forEach(type => {
		chrome.contextMenus.create({
			title: 'Copy ' + type + ' ID',
			id: 'PolyPlus-Copy' + type + 'ID',
			contexts: ['link'],
			documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
			targetUrlPatterns: [
				'https://polytoria.com/places/**'
			]
		});
	})
	*/
	chrome.contextMenus.create({
		title: 'Copy Place ID',
		id: 'PolyPlus-CopyPlaceID',
		contexts: ['link'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://polytoria.com/places/**'
		]
	});
	chrome.contextMenus.create({
		title: 'Copy User ID',
		id: 'PolyPlus-CopyUserID',
		contexts: ['link'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://polytoria.com/users/**',
			'https://polytoria.com/u/**'
		]
	});
	chrome.contextMenus.create({
		title: 'Copy Item ID',
		id: 'PolyPlus-CopyItemID',
		contexts: ['link'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://polytoria.com/store/**'
		]
	});
	chrome.contextMenus.create({
		title: 'Copy Guild ID',
		id: 'PolyPlus-CopyGuildID',
		contexts: ['link'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://polytoria.com/guilds/**'
		]
	});
	chrome.contextMenus.create({
		title: 'Copy Thread ID',
		id: 'PolyPlus-CopyThreadID',
		contexts: ['link'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://polytoria.com/forum/post/**'
		]
	});

	// COPY AVATAR HASH CONTEXT MENU ITEM REGISTRATION
	chrome.contextMenus.create({
		title: 'Copy Avatar Hash',
		id: 'PolyPlus-CopyAvatarHash',
		contexts: ['image'],
		documentUrlPatterns: ['https://polytoria.com/*', SettingsURL],
		targetUrlPatterns: [
			'https://c0.ptacdn.com/thumbnails/avatars/**'
		]
	});
});

// HANDLE CONTEXT MENU ITEMS
chrome.contextMenus.onClicked.addListener(async function (info, tab) {
	if (["CopyPlaceID", "CopyUserID", "CopyItemID", "CopyGuildID"].indexOf(info.menuItemId.split('-')[1]) !== -1) {
		let ID = info.linkUrl.split('/')[4];
		if (info.linkUrl.split('/')[3] === 'u') {
			ID = (await (await fetch('https://api.polytoria.com/v1/users/find?username=' + info.linkUrl.split('/')[4])).json()).id;
		}
		chrome.scripting
			.executeScript({
				target: {tabId: tab.id},
				func: CopyAssetID,
				args: [ID]
			})
			.then(() => console.log('Copied ID!'));
	}

	if (info.menuItemId === 'PolyPlus-CopyThreadID') {
		let ID = info.linkUrl.split('/')[5];
		chrome.scripting
			.executeScript({
				target: {tabId: tab.id},
				func: CopyAssetID,
				args: [ID]
			})
			.then(() => console.log('Copied ID!'));
	}

	if (info.menuItemId === 'PolyPlus-CopyAvatarHash') {
		let Hash = new URL(info.srcUrl).pathname.split('/')[3].replace('-icon', '').replace('.png', '');
		chrome.scripting
			.executeScript({
				target: {tabId: tab.id},
				func: CopyAvatarHash,
				args: [Hash]
			})
			.then(() => console.log('Copied ID!'));
	}

	if (info.menuItemId === 'PolyPlus-RunUpdateNotifier') {
		RunUpdateNotifier();
	}
});

/*
GREEN LOGO WHEN EXTENSION APPLIES TO CURRENT TAB PAGE, RED WHEN IT DOESN'T
COMING SOON

chrome.tabs.onActivated.addListener(function (info){
    chrome.tabs.get(info.tabId, function(tab){
        const Any = CheckIfScriptApplies(tab.url)
        console.log(Any)
    });
});

function CheckIfScriptApplies(url) {
	const matches = Manifest.content_scripts.map(script => {
        script.matches.forEach(match => {
			console.log(url, match, url.startsWith(match))
            if (url.startsWith(match)) {
                return true
            } else {
				return false
			}
        })
    })

	return matches
}

function matchesUrl(patterns, url) {
    return patterns.some(pattern => {
        return new RegExp(pattern).test(url);
    });
}
*/

function CopyAssetID(id) {
	navigator.clipboard
		.writeText(id)
		.catch((err) => {
			alert('Failure to copy ID.', err);
		});
}

function CopyAvatarHash(hash) {
	navigator.clipboard
		.writeText(hash)
		.then(() => {
			alert('Successfully copied avatar hash!');
		})
		.catch(() => {
			alert('Failure to copy avatar hash.');
		});
}

function OpenSweetAlert2Modal(icon, title, text) {
	console.log(window, window.Swal, window.bootstrap)
	window.Swal.fire({
		icon: icon,
		title: title,
		text: text
	})
}

// MergeObjects function was written by ChatGPT cause I was lazy and it was awhile ago
function MergeObjects(obj1, obj2) {
	var mergedObj = {};

	// Copy the values from obj1 to the mergedObj
	for (var key in obj1) {
		mergedObj[key] = obj1[key];
	}

	// Merge the values from obj2 into the mergedObj, favoring obj2 for non-existing keys in obj1
	for (var key in obj2) {
		if (!obj1.hasOwnProperty(key)) {
			mergedObj[key] = obj2[key];
		}
	}

	return mergedObj;
}