package main

import (
	"github.com/microcosm-cc/bluemonday"
	"encoding/json"
	"io/ioutil"
	"net/http"
	"strings"
	"regexp"
	"time"
	"log"
)

var p *bluemonday.Policy
var spaceReg *regexp.Regexp

// Change this to return a proper "err"
func GetNodeInfo(endpoint string) (http.Client, NodeInfo) {
	/* Checking order
	 * Mastodon/Pleroma
	 * Um..nothing else yet
	*/
	pleromastodon_nodeinfo_uri := "https://" + endpoint + "/nodeinfo/2.0.json"
	http_client := http.Client{}
	pleromastodon_api_resp, err := http_client.Get(pleromastodon_nodeinfo_uri)
	if err != nil {
		return http_client, NodeInfo{}
	} else {
		defer pleromastodon_api_resp.Body.Close()
	}

	if pleromastodon_api_resp.StatusCode == 200 {
		var nodeinfo NodeInfo
		err = json.NewDecoder(pleromastodon_api_resp.Body).Decode(&nodeinfo)
		if err == nil {
			defer pleromastodon_api_resp.Body.Close()
			return http_client, nodeinfo
		}
	}

	// Check the front page
	index_uri := "https://" + endpoint + "/"
	resp_index, err := http_client.Get(index_uri)
	if err != nil {
		log.Print("Unable to connect to " + endpoint + ", giving up")
		return http_client, NodeInfo{}
	}
	defer resp_index.Body.Close()
	indexbin, err := ioutil.ReadAll(resp_index.Body)
	if err != nil {
		log.Print("Unable to read index of " + endpoint + ", giving up")
		return http_client, NodeInfo{}
	}
	indexstr := string(indexbin)
	nodeinfo := NodeInfo{}
	if strings.Contains(indexstr, "Pleroma") || strings.Contains(indexstr, "Soapbox") {
		log.Print("Manual view: Pleroma" + endpoint)
		nodeinfo.Software.Name = "pleroma"
		nodeinfo.Software.Version = "guess"
	} else if strings.Contains(indexstr, "Mastodon") {
		log.Print("Manual view: Mastodon" + endpoint)
		nodeinfo.Software.Name = "mastodon"
		nodeinfo.Software.Version = "guess"
	} else if strings.Contains(indexstr, "Gab") {
		log.Print("Manual view: Gab" + endpoint)
		nodeinfo.Software.Name = "gab"
		nodeinfo.Software.Version = "guess"
	}

	return http_client, nodeinfo
}

func StartInstance(endpoint string, reportPostChan chan ReportPost) {
	http_client, nodeinfo := GetNodeInfo(endpoint)
	ri_mutex.Lock()
	m := runninginstances[endpoint]
	if nodeinfo.Software.Name == "" {
		m.Software = ""
		m.LastRun = time.Now().Format(time.RFC3339)
		m.Status = UNSUPPORTED_INSTANCE
		runninginstances[endpoint] = m
		ri_mutex.Unlock()
		return
	}

	m.client = http_client
	if nodeinfo.Software.Name == "pleroma" {
		log.Print("Starting " + endpoint + " as " + nodeinfo.Software.Name)
		m.CaptureType = "Poll"
		runninginstances[endpoint] = m
		ri_mutex.Unlock()
		PollMastodonPleroma(endpoint, reportPostChan, http_client)
	} else if nodeinfo.Software.Name == "mastodon" {
		log.Print("Starting " + endpoint + " as " + nodeinfo.Software.Name)
		m.CaptureType = "Stream"
		runninginstances[endpoint] = m
		ri_mutex.Unlock()
		PollMastodonPleroma(endpoint, reportPostChan, http_client)
		StreamMastodon(endpoint, reportPostChan)
	}

}