package models import ( "database/sql" "encoding/json" "fmt" ) type Cart_Item struct { Product_ID int Variant_ID int Quantity int } type Cart_Item_Detail struct { Product_ID int Variant_ID int Quantity int Name string Size string Price int Image_URL string Subtotal int } type Cart map[string]Cart_Item func cart_key(product_id, variant_id int) string { return fmt.Sprintf("%d_%d", product_id, variant_id) } func Parse_Cart(cart_json string) (Cart, error) { if cart_json == "" { return make(Cart), nil } var cart Cart if err := json.Unmarshal([]byte(cart_json), &cart); err != nil { return nil, err } return cart, nil } func Serialize_Cart(cart Cart) (string, error) { data, err := json.Marshal(cart) if err != nil { return "", err } return string(data), nil } func Add_To_Cart(cart Cart, product_id, variant_id, quantity int) Cart { key := cart_key(product_id, variant_id) if existing, ok := cart[key]; ok { existing.Quantity += quantity cart[key] = existing } else { cart[key] = Cart_Item{ Product_ID: product_id, Variant_ID: variant_id, Quantity: quantity, } } return cart } func Update_Cart_Quantity(cart Cart, product_id, variant_id, quantity int) Cart { key := cart_key(product_id, variant_id) if _, ok := cart[key]; ok { cart[key] = Cart_Item{ Product_ID: product_id, Variant_ID: variant_id, Quantity: quantity, } } return cart } func Remove_From_Cart(cart Cart, product_id, variant_id int) Cart { key := cart_key(product_id, variant_id) delete(cart, key) return cart } func Count_Cart_Items(cart Cart) int { total := 0 for _, item := range cart { total += item.Quantity } return total } func Get_Cart_Items_With_Details(db *sql.DB, cart Cart) ([]Cart_Item_Detail, error) { var items []Cart_Item_Detail for _, item := range cart { variant, err := Get_Variant_By_ID(db, item.Variant_ID) if err != nil { return nil, err } if variant == nil { continue } items = append(items, Cart_Item_Detail{ Product_ID: item.Product_ID, Variant_ID: item.Variant_ID, Quantity: item.Quantity, Name: variant.Product_Name, Size: variant.Size, Price: variant.Price, Image_URL: variant.Image_URL, Subtotal: variant.Price * item.Quantity, }) } return items, nil } func Get_Cart_Total(items []Cart_Item_Detail) int { total := 0 for _, item := range items { total += item.Subtotal } return total }