package cart

import (
	"fmt"

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

// mutation_set_pickup_point.go
//
// Registers the SetPickupPoint mutation using the generic mutation registry.
//
// Semantics (mirrors original switch-based implementation):
//   - Locate the delivery with Id == payload.DeliveryId
//   - Set (or overwrite) its PickupPoint with the provided data
//   - Does NOT alter pricing or taxes (so no totals recalculation required)
//
// Validation / Error Handling:
//   - If payload is nil -> error
//   - If DeliveryId not found -> error
//
// Concurrency:
//   - Relies on the existing expectation that higher-level mutation routing
//     serializes Apply() calls per grain; if stricter guarantees are needed,
//     a delivery-level lock could be introduced later.
//
// Future Extensions:
//   - Validate pickup point fields (country code, zip format, etc.)
//   - Track history / audit of pickup point changes
//   - Trigger delivery price adjustments (which would then require WithTotals()).

func SetPickupPoint(g *CartGrain, m *messages.SetPickupPoint) error {
	if m == nil {
		return fmt.Errorf("SetPickupPoint: nil payload")
	}

	for _, d := range g.Deliveries {
		if d.Id == uint32(m.DeliveryId) {
			d.PickupPoint = &messages.PickupPoint{
				Id:      m.Id,
				Name:    m.Name,
				Address: m.Address,
				City:    m.City,
				Zip:     m.Zip,
				Country: m.Country,
			}
			return nil
		}
	}
	return fmt.Errorf("SetPickupPoint: delivery id %d not found", m.DeliveryId)
}

func ClearCart(g *CartGrain, m *messages.ClearCartRequest) error {
	if m == nil {
		return fmt.Errorf("ClearCart: nil payload")
	}
	// maybe check if payment is done?
	g.Deliveries = g.Deliveries[:0]
	g.Items = g.Items[:0]
	g.UpdateTotals()
	return nil
}
