package handler

import (
	"context"
	"crypto/rand"
	"crypto/tls"
	"encoding/base64"
	gomail "gopkg.in/mail.v2"
)

func generateRandomPassword(length int) (string, error) {
	buffer := make([]byte, length)
	_, err := rand.Read(buffer)
	if err != nil {
		return "", err
	}
	password := base64.StdEncoding.EncodeToString(buffer)[:length]
	return password, nil
}

func (h *SolidarityServiceHandler) ForgetAccount(ctx context.Context, username string, namespace string) (response bool, access_Code string) {
	account, err := h.Services.MobilityAccounts.GetAccountUsername(ctx, username, namespace)
	if err == nil {
		message := []byte("Hello dear,\nYour new Silvermobi password is: ")
		password, _ := generateRandomPassword(10)
		update := h.Services.MobilityAccounts.UpdatePassword(ctx, account.ID, password)
		if update == false {
			return false, ""
		}
		m := gomail.NewMessage()
		m.SetHeader("From", h.Config.GetString("emailing.smtp.username"))
		m.SetHeader("To", username)
		m.SetHeader("Subject", "Silvermobi Password Recovery")
		message = append(message, []byte(password)...)
		m.SetBody("text/plain", string(message))
		d := gomail.NewDialer(h.Config.GetString("emailing.smtp.host"), h.Config.GetInt("emailing.smtp.port"), h.Config.GetString("emailing.smtp.username"),
			h.Config.GetString("emailing.smtp.password"))
		d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
		if err := d.DialAndSend(m); err != nil {
			return false, ""
		}
		return true, password
	} else {
		return false, ""
	}
}
