package webcontroller

import (
	"net/http"
	"net/url"
	"strings"

	"fornaxian.tech/pixeldrain_api_client/pixelapi"
)

const defaultThemeColour = "#220735"
const defaultHost = "https://nova.storage"

type ogData struct {
	MetaPropRules []ogProp
	MetaNameRules []ogProp
	LinkRules     []ogProp
}

type ogProp struct {
	Key   string
	Value string
}

func (og *ogData) addProp(k, v string) { og.MetaPropRules = append(og.MetaPropRules, ogProp{k, v}) }
func (og *ogData) addName(k, v string) { og.MetaNameRules = append(og.MetaNameRules, ogProp{k, v}) }
func (og *ogData) addLink(k, v string) { og.LinkRules = append(og.LinkRules, ogProp{k, v}) }

func generateOGData(name, filetype, pageurl, fileurl, thumbnailurl, themecolour string) (og ogData) {
	og.addProp("og:title", name)
	og.addProp("og:site_name", "Nova.storage")
	og.addProp("og:description", "This file has been shared with you on Nova")
	og.addProp("og:url", pageurl)
	og.addProp("description", "This file has been shared with you on Nova")
	og.addName("description", "This file has been shared with you on Nova")
	og.addName("keywords", "shared,sharing,upload,file")
	og.addName("twitter:title", name)
	og.addName("twitter:site", "@Fornax96")
	og.addName("twitter:domain", "nova.storage")
	og.addName("theme-color", themecolour)

	if strings.HasPrefix(filetype, "image") {
		og.addProp("og:type", "article")
		og.addProp("og:image", fileurl)
		og.addProp("og:image:url", fileurl)
		og.addProp("og:image:secure_url", fileurl)
		og.addProp("og:image:type", filetype)

		og.addName("twitter:card", "summary_large_image")
		og.addName("twitter:image", fileurl)
		og.addLink("image_src", fileurl)
	} else if strings.HasPrefix(filetype, "video") {
		og.addProp("og:type", "video.other")
		og.addProp("og:image", thumbnailurl)
		og.addProp("og:video", fileurl)
		og.addProp("og:video:url", fileurl)
		og.addProp("og:video:secure_url", fileurl)
		og.addProp("og:video:type", filetype)

		og.addName("twitter:card", "player")
		og.addName("twitter:image", thumbnailurl)
		og.addName("twitter:player", fileurl)
		og.addName("twitter:player:stream", fileurl)
		og.addName("twitter:player:stream:content_type", filetype)
		og.addLink("image_src", thumbnailurl)
	} else if strings.HasPrefix(filetype, "audio") {
		og.addProp("og:type", "music.song")
		og.addProp("og:image", thumbnailurl)
		og.addProp("og:audio", fileurl)
		og.addProp("og:audio:secure_url", fileurl)
		og.addProp("og:audio:type", filetype)
		og.addLink("image_src", thumbnailurl)
	} else {
		og.addProp("og:type", "website")
		og.addProp("og:image", thumbnailurl)
		og.addLink("image_src", thumbnailurl)
	}
	return og
}

func getRequestAddress(r *http.Request) (addr string) {
	if r.Host == "" {
		return defaultHost
	} else if r.TLS == nil {
		return "http://" + r.Host
	} else {
		return "https://" + r.Host
	}
}
func (wc *WebController) metadataFromFilesystem(r *http.Request, f pixelapi.FilesystemPath) (og ogData) {
	var addr = getRequestAddress(r)
	var base = &f.Path[f.BaseIndex]

	// Encode the file path
	var split = strings.Split(base.Path, "/")
	for i := range split {
		split[i] = url.PathEscape(split[i])
	}
	var filepath = strings.Join(split, "/")

	// Get the theme colour
	var colour = defaultThemeColour
	for _, node := range f.Path {
		if node.Properties["branding_enabled"] == "true" &&
			node.Properties["brand_highlight_color"] != "" {
			colour = node.Properties["brand_highlight_color"]
		}
	}

	return generateOGData(
		base.Name,
		base.FileType,
		addr+"/d"+filepath,
		addr+"/api/filesystem"+filepath,
		addr+"/api/filesystem"+filepath+"?thumbnail",
		colour,
	)
}
