```python
def tier_cost(units: int, allowance: int, first_rate: int, later_rate: int) -> int:
    if units < 0:
        raise ValueError("Number of units must be non-negative.")
    
    if allowance < 0:
        raise ValueError("Allowance must be non-negative.")
    
    if first_rate <= 0 or later_rate <= 0:
        raise ValueError("Rates must be positive.")
    
    if allowance == 0:
        return units * first_rate
    
    if units <= allowance:
        return allowance * first_rate + (units - allowance) * later_rate
    
    return allowance * first_rate + (allowance - 1) * later_rate + (units - allowance) * later_rate
```