package main

import (
	"io"
	"log"
	"net/http"
	"net/url"
	"strconv"
	"strings"
	"time"
)

type message struct {
	account             account
	content, visibility string
	feed                feed
}

func (msg *message) post() error {
	if debug {
		log.Printf("msg:\n\n%v", msg)
		log.Printf("msg.feed:\n\n%v", msg.feed)
	}

	apiURL := msg.account.InstanceURL + "/api/v1/statuses"

	data := url.Values{}
	data.Set("status", msg.content)
	data.Set("visibility", msg.feed.Visibility)
	data.Set("sensitive", strconv.FormatBool(msg.feed.Sensitive))
	data.Set("spoiler_text", msg.feed.ContentWarning)

	if debug {
		log.Printf("Data:\n\n%v", data)
	}

	switch msg.feed.Format {
	case "markdown":
		data.Set("content_type", "text/markdown")
	case "html":
		data.Set("content_type", "text/html")
	case "plain":
		data.Set("content_type", "text/plain")
	case "bbcode":
		data.Set("content_type", "text/bbcode")
	}

	var req *http.Request
	var body io.Reader
	body = strings.NewReader(data.Encode())

	if debug {
		log.Printf("Message:\n\n%s", msg.content)
	}

	req, err := http.NewRequest("POST", apiURL, body)
	if err != nil {
		return err
	}

	if debug {
		log.Printf("Request:\n\n%v", body)
	}

	// Set Headers
	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
	req.Header.Set("Authorization", "Bearer "+msg.account.AccessToken)
	req.Header.Set("User-Agent", conf.HttpConfig.UserAgent)

	c := &http.Client{Timeout: time.Second * 10}

	if !debugOrDryRun {
		var resp *http.Response
		resp, err = c.Do(req)
		if err != nil {
			return err
		}
		defer func(Body io.ReadCloser) {
			_ = Body.Close()
		}(resp.Body)

		log.Println("response Status: ", resp.Status)
	}

	return nil
}