import { AnimeNotifier } from "../AnimeNotifier"
import { StatusMessage } from "../StatusMessage"

// Select file
export function selectFile(arn: AnimeNotifier, button: HTMLButtonElement) {
	if(arn.user.dataset.pro !== "true") {
		alert("Please buy a PRO account to use this feature.")
		return
	}

	let preview = document.getElementById(button.dataset.previewImageId) as HTMLImageElement
	let endpoint = button.dataset.endpoint

	// Click on virtual file input element
	let input = document.createElement("input")
	input.setAttribute("type", "file")

	input.onchange = () => {
		let file = input.files[0]

		if(!file) {
			return
		}

		if(!file.type.startsWith("image/")) {
			arn.statusMessage.showError(file.name + " is not an image file!")
			return
		}

		previewImage(file, endpoint, preview)
		uploadFile(file, endpoint, arn)
	}

	input.click()
}

// Preview image
function previewImage(file: File, endpoint: string, preview: HTMLImageElement) {
	let reader = new FileReader()

	reader.onloadend = () => {
		if(endpoint === "/api/upload/avatar") {
			let svgPreview = document.getElementById("avatar-input-preview-svg") as HTMLImageElement

			if(svgPreview) {
				svgPreview.classList.add("hidden")
			}
		}

		preview.classList.remove("hidden")
		preview.src = reader.result
	}

	reader.readAsDataURL(file)
}

// Upload file
function uploadFile(file: File, endpoint: string, arn: AnimeNotifier) {
	let reader = new FileReader()

	reader.onloadend = async () => {
		arn.statusMessage.showInfo("Uploading image...", 60000)

		let response = await fetch(endpoint, {
			method: "POST",
			credentials: "include",
			headers: {
				"Content-Type": "application/octet-stream"
			},
			body: reader.result
		})

		if(endpoint === "/api/upload/avatar") {
			let newURL = await response.text()
			updateSideBarAvatar(newURL)
		}

		if(response.ok) {
			arn.statusMessage.showInfo("Successfully uploaded your new image.")
		} else {
			arn.statusMessage.showError("Failed uploading your new image.")
		}
	}

	reader.readAsArrayBuffer(file)
}

// Update sidebar avatar
function updateSideBarAvatar(url: string) {
	let sidebar = document.getElementById("sidebar")
	let userImage = sidebar.getElementsByClassName("user-image")[0] as HTMLImageElement
	let lazyLoad = userImage["became visible"]

	if(lazyLoad) {
		userImage.dataset.src = url
		lazyLoad()
	} else {
		location.reload()
	}
}