package salesforcehandler

import (
	"fmt"
	"net/http"

	"github.com/pingcap/dbaas/billing2/config"
	"github.com/pingcap/dbaas/billing2/utils/httpclient"
)

const (
	accessTokenApiPrefix = "/services/oauth2/token"
	TimeFormat           = "2006-01-02 15:04:05.000Z"
)

type AccessTokenResponse struct {
	AccessToken string `json:"access_token"`
}

func getSalesforceAccessToken() (string, error) {
	params := map[string]string{
		"grant_type":    "password",
		"client_id":     config.Get().GetString(config.SalesforceClientID),
		"client_secret": config.Get().GetString(config.SalesforceClientSecret),
		"username":      config.Get().GetString(config.SalesforceUsername),
		"password":      config.Get().GetString(config.SalesforcePassword),
	}
	output := AccessTokenResponse{}

	err := httpclient.NewClient(nil, "https://"+config.Get().GetString(config.SalesforceDomain), "/").Request("POST", accessTokenApiPrefix, params, nil, &output)
	if err != nil {
		return "", err
	}
	return output.AccessToken, nil
}

func signSalesforceAuth(req *http.Request) error {
	token, err := getSalesforceAccessToken()
	if err != nil {
		return err
	}
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
	return nil
}

func getClient() httpclient.HTTPClient {
	return httpclient.NewClient(signSalesforceAuth, "https://"+config.Get().GetString(config.SalesforceDomain), "/")
}
