#pragma once

#include <random>

class Fruit;
class Alcohol;
class Item;

class CargoDamageVisitor {
public:
    CargoDamageVisitor() = default;
    virtual ~CargoDamageVisitor() = default;
    CargoDamageVisitor(const CargoDamageVisitor&) = default;
    CargoDamageVisitor(CargoDamageVisitor&&) = default;
    CargoDamageVisitor& operator=(const CargoDamageVisitor&) = default;
    CargoDamageVisitor& operator=(CargoDamageVisitor&&) = default;

    virtual void operator()(Fruit& fruit) const;
    virtual void operator()(Alcohol& alcohol) const;
    virtual void operator()(Item& item) const;

private:
    static std::random_device _rd;
    mutable std::mt19937 _seed{_rd()};
};
