package tasks

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"ocl/portainer-devtool/configs"
)

type GenerateJwtTokenTask struct {
	Config *configs.Config
}

type GenerateJwtTokenResponse struct {
	JWT string `json:"jwt"`
}

func NewGenerateJwtTokenTask(cfg *configs.Config) *GenerateJwtTokenTask {
	return &GenerateJwtTokenTask{
		Config: cfg,
	}
}

func (task *GenerateJwtTokenTask) Execute() error {
	postBody, _ := json.Marshal(map[string]string{
		"username": task.Config.LoginCredential.Username,
		"password": task.Config.LoginCredential.Password,
	})

	responseBody := bytes.NewBuffer(postBody)
	resp, err := http.Post(task.Config.LoginCredential.Address, "application/json", responseBody)
	if err != nil {
		return fmt.Errorf("http requset error: %s", err.Error())
	}
	defer resp.Body.Close()

	//Read the response body
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("failed to parse the response body: %s", err.Error())
	}

	var ret GenerateJwtTokenResponse
	err = json.Unmarshal(body, &ret)
	if err != nil {
		return err
	}

	fmt.Printf("jwt token is:\n%s\n", ret.JWT)
	return nil
}

func (task *GenerateJwtTokenTask) String() string {
	return "Generate JWT Token"
}
