package imapserver

import (
	"github.com/emersion/go-imap/v2"
	"github.com/emersion/go-imap/v2/internal/imapwire"
)

func (c *Conn) handleLogin(tag string, dec *imapwire.Decoder) error {
	var username, password string
	if !dec.ExpectSP() || !dec.ExpectAString(&username) || !dec.ExpectSP() || !dec.ExpectAString(&password) || !dec.ExpectCRLF() {
		return dec.Err()
	}
	if err := c.checkState(imap.ConnStateNotAuthenticated); err != nil {
		return err
	}
	if !c.canAuth() {
		return &imap.Error{
			Type: imap.StatusResponseTypeNo,
			Code: imap.ResponseCodePrivacyRequired,
			Text: "TLS is required to authenticate",
		}
	}
	if err := c.session.Login(username, password); err != nil {
		return err
	}
	c.state = imap.ConnStateAuthenticated
	return c.writeCapabilityStatus(tag, imap.StatusResponseTypeOK, "Logged in")
}
