diff --git a/src/pantry/core/inventory.go b/src/pantry/core/inventory.go index a58f12f..30a3af7 100644 --- a/src/pantry/core/inventory.go +++ b/src/pantry/core/inventory.go @@ -21,7 +21,7 @@ type Inventory struct { func (p *Inventory) AddItem(item InventoryItem) { for i, existing := range p.Items { - if existing.Name == item.Name { + if existing.Name == item.Name && existing.Expiry.Equal(*item.Expiry) { p.Items[i].Quantity += item.Quantity fmt.Printf("Updated %s, new quantity: %.2f %s\n", item.Name, p.Items[i].Quantity, item.Unit) return @@ -31,6 +31,65 @@ func (p *Inventory) AddItem(item InventoryItem) { fmt.Printf("Added %s, quantity: %.2f %s\n", item.Name, item.Quantity, item.Unit) } +func (p *Inventory) RemoveItem(name string, quantity float64, expiry *time.Time) { + for i := 0; i < len(p.Items); { + item := p.Items[i] + + itemExpiry := "nil" + if item.Expiry != nil { + itemExpiry = item.Expiry.Format("2006-01-02") + } + inputExpiry := "nil" + if expiry != nil { + inputExpiry = expiry.Format("2006-01-02") + } + + fmt.Printf("Checking: item.Name=%s | item.Expiry=%s\n", item.Name, itemExpiry) + fmt.Printf("Against: name=%s | expiry=%s\n", name, inputExpiry) + + if item.Name != name { + i++ + continue + } + + if expiry != nil { + if item.Expiry == nil || item.Expiry.Format("2006-01-02") != expiry.Format("2006-01-02") { + i++ + continue + } + } else { + var bestIndex = i + for j := i + 1; j < len(p.Items); j++ { + next := p.Items[j] + if next.Name != name { + continue + } + if next.Expiry == nil { + continue + } + if item.Expiry == nil || next.Expiry.Before(*item.Expiry) { + item = next + bestIndex = j + } + } + i = bestIndex + } + + if quantity <= 0 || quantity >= item.Quantity { + p.Items = append(p.Items[:i], p.Items[i+1:]...) + fmt.Printf("Removed all of %s (expiry: %s)\n", item.Name, item.Expiry.Format("2006-01-02")) + } else { + p.Items[i].Quantity -= quantity + fmt.Printf("Removed %.2f %s from %s (expiry: %s)\n", quantity, item.Unit, item.Name, item.Expiry.Format("2006-01-02")) + i++ + } + + return + } + + fmt.Printf("Item not found or no matching expiry.\n") +} + func (p *Inventory) ListItems() { if len(p.Items) == 0 { fmt.Printf("Pantry is empty\n") diff --git a/src/pantry/main.go b/src/pantry/main.go index 106e790..ffcb5b3 100644 --- a/src/pantry/main.go +++ b/src/pantry/main.go @@ -73,6 +73,35 @@ func main() { return } + case "remove": + if len(os.Args) < 4 { + fmt.Println("Usage: inventory remove [name] [quantity] [expiry:YYYY-MM-DD]") + return + } + name := os.Args[2] + quantity, err := strconv.ParseFloat(os.Args[3], 64) + if err != nil { + fmt.Println("Invalid quantity") + return + } + + var expiry *time.Time + if len(os.Args) >= 5 { + parsed, err := time.Parse("2006-01-02", os.Args[4]) + if err != nil { + fmt.Println("Invalid expiry date format. Expected YYYY-MM-DD") + return + } + expiry = &parsed + } + + inventory.RemoveItem(name, quantity, expiry) + + err = core.SaveInventory(dataFile, inventory) + if err != nil { + fmt.Println("Failed to save inventory:", err) + } + case "list": inventory.ListItems()