using ProjectFighterJet.Drawnings;
namespace ProjectFighterJet.CollectionGenericObjects;

public abstract class AbstractCompany
{
    /// <summary>
    /// Размер места (ширина)
    /// </summary>
    protected readonly int _placeSizeWidth = 220;

    /// <summary>
    /// Размер места (высота)
    /// </summary>
    protected readonly int _placeSizeHeight = 155;

    /// <summary>
    /// Ширина окна
    /// </summary>
    protected readonly int _pictureWidth;

    /// <summary>
    /// Высота окна
    /// </summary>
    protected readonly int _pictureHeight;
    protected static int amountOfObjects = 0;
    /// <summary>
    /// Коллекция бомбардировщиков
    /// </summary>
    protected ICollectionGenericObjects<DrawningJet>? _collection = null;

    public static int getAmountOfObjects()
    {
        return amountOfObjects;
    }

    /// <summary>
    /// Вычисление максимального количества элементов, который можно разместить в окне
    /// </summary>
    private int GetMaxCount => _pictureWidth * _pictureHeight / (_placeSizeWidth * _placeSizeHeight);

    /// <summary>
    /// Конструктор
    /// </summary>
    /// <param name="picWidth">Ширина окна</param>
    /// <param name="picHeight">Высота окна</param>
    /// <param name="collection">Коллекция бомбардировщиков</param>
    public AbstractCompany(int picWidth, int picHeight, ICollectionGenericObjects<DrawningJet> collection)
    {
        _pictureWidth = picWidth;
        _pictureHeight = picHeight;
        _collection = collection;
        _collection.SetMaxCount = GetMaxCount;
    }

    /// <summary>
    /// Перегрузка оператора сложения для класса
    /// </summary>
    /// <param name="company">Компания</param>
    /// <param name="stormtrooper">Добавляемый объект</param>
    /// <returns></returns>
    public static int operator +(AbstractCompany company, DrawningJet stormtrooper)
    {
        return company._collection.Insert(stormtrooper);
    }

    /// <summary>
    /// Перегрузка оператора удаления для класса
    /// </summary>
    /// <param name="company">Компания</param>
    /// <param name="position">Номер удаляемого объекта</param>
    /// <returns></returns>
    public static DrawningJet operator -(AbstractCompany company, int position)
    {
        return company._collection.Remove(position);
    }

    /// <summary>
    /// Получение случайного объекта из коллекции
    /// </summary>
    /// <returns></returns>
    public DrawningJet? GetRandomObject()
    {
        Random rnd = new();
        return _collection?.Get(rnd.Next(GetMaxCount));
    }

    /// <summary>
    /// Вывод всей коллекции
    /// </summary>
    /// <returns></returns>
    public Bitmap? Show()
    {
        Bitmap bitmap = new(_pictureWidth, _pictureHeight);
        Graphics graphics = Graphics.FromImage(bitmap);
        DrawBackgound(graphics);
        SetObjectsPosition();
        for (int i = 0; i < (_collection?.Count ?? 0); ++i)
        {
            DrawningJet? obj = _collection?.Get(i);
            obj?.DrawTransport(graphics);
        }
        return bitmap;
    }

    /// <summary>
    /// Вывод заднего фона
    /// </summary>
    /// <param name="g"></param>
    protected abstract void DrawBackgound(Graphics g);

    /// <summary>
    /// Расстановка объектов
    /// </summary>
    protected abstract void SetObjectsPosition();
}