package matrixbot

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"
)

type PusherRequest struct {
	AppDisplayName    string     `json:"app_display_name"`
	AppId             string     `json:"app_id"`
	Append            bool       `json:"append"`
	Data              PusherData `json:"data"`
	DeviceDisplayName string     `json:"device_display_name"`
	Kind              string     `json:"kind"`
	Lang              string     `json:"lang"`
	ProfileTag        string     `json:"profile_tag"`
	PushKey           string     `json:"pushkey"`
}

type PusherData struct {
	Format string `json:"format,omitempty"`
	Url    string `json:"url"`
}

func SetPusher(token MatrixToken, pusher PusherRequest) error {
	body, err := json.Marshal(pusher)
	if err != nil {
		return err
	}
	fmt.Println(string(body))
	request, err := http.NewRequest(
		http.MethodPost,
		"https://matrix-client.matrix.org/_matrix/client/v3/pushers/set",
		bytes.NewReader(body),
	)
	if err != nil {
		panic(err)
	}
	request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token.AccessToken))
	response, err := http.DefaultClient.Do(request)
	if err != nil {
		return err
	}
	if response.StatusCode < 200 || response.StatusCode >= 300 {
		_, _ = io.Copy(os.Stdout, response.Body)
		return fmt.Errorf("request failed %d: %s", response.StatusCode, response.Status)
	}
	return err
}