package main

import (
	"fmt"
	"slices"

	"git.tornberg.me/go-cart-actor/pkg/actor"
	"git.tornberg.me/go-cart-actor/pkg/messages"
	"git.tornberg.me/go-cart-actor/pkg/voucher"
)

func (ctx *MutationContext) AddVoucher(g *CartGrain, m *messages.AddVoucher) error {
	if m == nil {
		return &actor.MutationError{
			Message:    "AddVoucher: nil payload",
			Code:       1001,
			StatusCode: 400,
		}
	}

	if slices.ContainsFunc(g.Vouchers, func(v *voucher.Voucher) bool {
		return v.Code == m.Code
	}) {
		return &actor.MutationError{
			Message:    "voucher already applied",
			Code:       1002,
			StatusCode: 400,
		}
	}

	voucherData, err := ctx.VoucherService.GetVoucher(m.Code)
	if err != nil {
		return &actor.MutationError{
			Message:    fmt.Sprintf("cant find voucher: %v", err),
			Code:       1003,
			StatusCode: 400,
		}
	}

	if voucherData == nil {
		return nil
	}

	g.Vouchers = append(g.Vouchers, voucherData)
	g.UpdateTotals()
	return nil
}
