package services

import (
	"fmt"
	"net/smtp"
	"strings"

	configs "goFiber/config"
)

type EmailService struct{}

func NewEmailService() *EmailService {
	return &EmailService{}
}

func (s *EmailService) Send(to, subject, body string) error {
	host := strings.TrimSpace(configs.AppConfig.EmailHost)
	port := strings.TrimSpace(configs.AppConfig.EmailPort)
	from := strings.TrimSpace(configs.AppConfig.EmailFrom)

	if host == "" || port == "" || from == "" {
		return fmt.Errorf("email configuration is incomplete")
	}

	addr := host + ":" + port
	username := strings.TrimSpace(configs.AppConfig.EmailHostUser)
	password := strings.TrimSpace(configs.AppConfig.EmailHostPassword)

	var auth smtp.Auth
	if username != "" && password != "" {
		auth = smtp.PlainAuth("", username, password, host)
	}

	message := "From: " + from + "\r\n" +
		"To: " + to + "\r\n" +
		"Subject: " + subject + "\r\n" +
		"MIME-Version: 1.0\r\n" +
		"Content-Type: text/plain; charset=UTF-8\r\n\r\n" +
		body

	return smtp.SendMail(addr, auth, from, []string{to}, []byte(message))
}

func (s *EmailService) SendVerificationEmail(to, firstName, verifyURL string) error {
	subject := "Email verification"
	body := fmt.Sprintf(
		"Hi %s,\n\nPlease verify your email by opening this link:\n%s\n\nIf you did not create this account, you can ignore this email.",
		firstName,
		verifyURL,
	)
	return s.Send(to, subject, body)
}
