package dbdata

import (
	"encoding/json"
	"fmt"
	"github.com/spf13/viper"
	"io"
	"log"
	"net/http"
)

type OtpAuthResult struct {
	User       string `json:"user"`
	TokenValid bool   `json:"token_valid"`
}

func ValidateUserOtp(name string, otp int) (bool, error) {

	v := viper.New()
	v.SetConfigFile("./conf/server.toml")
	if err := v.ReadInConfig(); err != nil {
		panic("config file err:" + err.Error())

	}

	// 验证动态口令
	otpServ := v.Get("otp_server")
	otpAuthUrl := fmt.Sprintf("%s/%s/token/%d", otpServ, name, otp)
	fmt.Println("otpAuthUrl: ", otpAuthUrl)
	resp, err := http.Get(otpAuthUrl)

	if err != nil || resp.StatusCode != 200 {
		log.Fatalf("otp server auth err, user=[%s], token=[%d], httpcode=[%d], err=[%v]", name, otp, resp.StatusCode, err)
		return false, err
	}

	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			panic(err)
		}
	}(resp.Body)

	b, err := io.ReadAll(resp.Body)
	if err != nil {
		log.Fatalf("io.ReadAll read http response body failed, err=[%v]", err)
		return false, err
	}

	var optAuthResult OtpAuthResult
	err = json.Unmarshal(b, &optAuthResult)

	if err != nil {
		log.Fatalf("unmarshalotp retmsg failed, user=[%s], token=[%d], httpcode=[%d], err=[%v]", name, otp, resp.StatusCode, err)
		return false, err
	}

	return optAuthResult.TokenValid, nil
}