package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"encoding/json"
	"fmt"
	"strings"
	"time"
)

type PayoutRequest struct {
	BeneficiaryName     string  `json:"beneficiary_name"`
	BeneficiaryEmail    string  `json:"beneficiary_email"`
	BeneficiaryMobileNo int64   `json:"beneficiary_mobile_no"`
	BeneficiaryAddress  string  `json:"beneficiary_address"`
	PaymentMethod       string  `json:"payment_method"`
	BeneficiaryAccNo    string  `json:"beneficiary_acc_no"`
	BankName            string  `json:"bank_name"`
	IFSC                string  `json:"ifsc"`
	Amount              int     `json:"amount"`
	OrderID             string  `json:"order_id"`
	UserID              string  `json:"user_id"`
	Remarks             *string `json:"remarks"`
}

func main() {

	secret := "{{YOUR_SECRET_KEY}}"
	path := "api/v1/payout/initiate"
	method := "POST"

	data := PayoutRequest{
		BeneficiaryName:     "test",
		BeneficiaryEmail:    "test@gmail.com",
		BeneficiaryMobileNo: 9999999999,
		BeneficiaryAddress:  "test add",
		PaymentMethod:       "IMPS",
		BeneficiaryAccNo:    "587575867564",
		BankName:            "SBI",
		IFSC:                "SBIN0067859",
		Amount:              100,
		OrderID:             "qweq-2d2fss-2234sd-44533",
		UserID:              "aseq-2d2fss-22a4sd-44a33",
		Remarks:             nil,
	}

	// Marshal JSON (ordered because struct)
	jsonData, _ := json.Marshal(data)

	jsonPHP := strings.ReplaceAll(string(jsonData), "/", "\\/")

	timestamp := time.Now().UnixMilli()

	message := fmt.Sprintf(
		"%s\n%s\n%s\n%d\n",
		method,
		path,
		jsonPHP,
		timestamp,
	)

	h := hmac.New(sha256.New, []byte(secret))
	h.Write([]byte(message))
	signature := hex.EncodeToString(h.Sum(nil))

	fmt.Println("Signature:", signature)
	fmt.Println("Timestamp:", timestamp)
}
