package command

import (
	"github.com/caos/zitadel/internal/domain"
	"github.com/caos/zitadel/internal/eventstore"
	"github.com/caos/zitadel/internal/repository/policy"
)

type MailTextWriteModel struct {
	eventstore.WriteModel

	MailTextType string
	Language     string
	Title        string
	PreHeader    string
	Subject      string
	Greeting     string
	Text         string
	ButtonText   string

	State domain.PolicyState
}

func (wm *MailTextWriteModel) Reduce() error {
	for _, event := range wm.Events {
		switch e := event.(type) {
		case *policy.MailTextAddedEvent:
			if wm.MailTextType != e.MailTextType || wm.Language != e.Language {
				continue
			}
			wm.Title = e.Title
			wm.PreHeader = e.PreHeader
			wm.Subject = e.Subject
			wm.Greeting = e.Greeting
			wm.Text = e.Text
			wm.ButtonText = e.ButtonText
			wm.State = domain.PolicyStateActive
		case *policy.MailTextChangedEvent:
			if wm.MailTextType != e.MailTextType || wm.Language != e.Language {
				continue
			}
			if e.Title != nil {
				wm.Title = *e.Title
			}
			if e.PreHeader != nil {
				wm.PreHeader = *e.PreHeader
			}
			if e.Subject != nil {
				wm.Subject = *e.Subject
			}
			if e.Greeting != nil {
				wm.Greeting = *e.Greeting
			}
			if e.Text != nil {
				wm.Text = *e.Text
			}
			if e.ButtonText != nil {
				wm.ButtonText = *e.ButtonText
			}
		case *policy.MailTextRemovedEvent:
			wm.State = domain.PolicyStateRemoved
		}
	}
	return wm.WriteModel.Reduce()
}