using System;
namespace CutList.Core
{
///
/// Represents an item to be placed in a bin.
/// Enforces business rules for valid items.
///
public class BinItem
{
private string _name;
private double _length;
public BinItem(string name, double length)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Item name cannot be empty", nameof(name));
if (length <= 0)
throw new ArgumentException("Item length must be greater than zero", nameof(length));
_name = name;
_length = length;
}
///
/// Parameterless constructor for serialization only.
/// Use the parameterized constructor for creating valid instances.
///
public BinItem()
{
}
public string Name
{
get => _name;
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentException("Item name cannot be empty", nameof(value));
_name = value;
}
}
public double Length
{
get => _length;
set
{
if (value <= 0)
throw new ArgumentException("Item length must be greater than zero", nameof(value));
_length = value;
}
}
///
/// Checks if this item can fit in the given available length.
///
public bool CanFitIn(double availableLength)
{
return Length <= availableLength;
}
///
/// Checks if this item can fit in the given available length with spacing.
///
public bool CanFitInWithSpacing(double availableLength, double spacing)
{
return Length + spacing <= availableLength;
}
public override string ToString()
{
return $"{Name} ({Length}\")";
}
public override bool Equals(object? obj)
{
if (obj is BinItem other)
{
return Name == other.Name && Length.IsEqualTo(other.Length);
}
return false;
}
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + (Name?.GetHashCode() ?? 0);
hash = hash * 23 + Length.GetHashCode();
return hash;
}
}
}
}