package admin

import (
	"crypto/tls"
	"errors"
	"time"

	"github.com/bjdgyc/anylink/base"
	"github.com/bjdgyc/anylink/dbdata"
	"github.com/golang-jwt/jwt/v4"
	mail "github.com/xhit/go-simple-mail/v2"
	// "github.com/mojocn/base64Captcha"
)

func SetJwtData(data map[string]interface{}, expiresAt int64) (string, error) {
	jwtData := jwt.MapClaims{"exp": expiresAt}
	for k, v := range data {
		jwtData[k] = v
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwtData)

	// Sign and get the complete encoded token as a string using the secret
	tokenString, err := token.SignedString([]byte(base.Cfg.JwtSecret))
	return tokenString, err
}

func GetJwtData(jwtToken string) (map[string]interface{}, error) {
	token, err := jwt.Parse(jwtToken, func(token *jwt.Token) (interface{}, error) {
		// since we only use the one private key to sign the tokens,
		// we also only use its public counter part to verify
		return []byte(base.Cfg.JwtSecret), nil
	})

	if err != nil || !token.Valid {
		return nil, err
	}

	claims, ok := token.Claims.(jwt.MapClaims)
	if !ok {
		return nil, errors.New("data is parse err")
	}

	return claims, nil
}

func SendMail(subject, to, htmlBody string, attach *mail.File) error {

	dataSmtp := &dbdata.SettingSmtp{}
	err := dbdata.SettingGet(dataSmtp)
	if err != nil {
		base.Error(err)
		return err
	}

	server := mail.NewSMTPClient()

	// SMTP Server
	server.Host = dataSmtp.Host
	server.Port = dataSmtp.Port
	server.Username = dataSmtp.Username
	server.Password = dataSmtp.Password

	switch dataSmtp.Encryption {
	case "SSLTLS":
		server.Encryption = mail.EncryptionSSLTLS
	case "STARTTLS":
		server.Encryption = mail.EncryptionSTARTTLS
	default:
		server.Encryption = mail.EncryptionNone
	}

	// Since v2.3.0 you can specified authentication type:
	// - PLAIN (default)
	// - LOGIN
	// - CRAM-MD5
	server.Authentication = mail.AuthAuto

	// Variable to keep alive connection
	server.KeepAlive = false

	// Timeout for connect to SMTP Server
	server.ConnectTimeout = 10 * time.Second

	// Timeout for send the data and wait respond
	server.SendTimeout = 10 * time.Second

	// Set TLSConfig to provide custom TLS configuration. For example,
	// to skip TLS verification (useful for testing):
	server.TLSConfig = &tls.Config{InsecureSkipVerify: true}

	// SMTP client
	smtpClient, err := server.Connect()

	if err != nil {
		base.Error(err)
		return err
	}

	// New email simple html with inline and CC
	email := mail.NewMSG()
	email.SetFrom(dataSmtp.From).
		AddTo(to).
		SetSubject(subject)

	if attach != nil {
		email.Attach(attach)
	}

	email.SetBody(mail.TextHTML, htmlBody)

	// Call Send and pass the client
	err = email.Send(smtpClient)
	if err != nil {
		base.Error(err)
	}

	return err
}
