using Friflo.Engine.ECS;
using LittleSim.Content;
using LittleSim.Scenes;
using Microsoft.Xna.Framework;
using MrGameEng.Graphics;

namespace LittleSim.Sim;

/// <summary>
/// Единая точка создания сущности-растения: спрайт стадии по возрасту, тинт по морфе генома и
/// компоненты роста/генома. Переиспользуется начальным скаттером, размножением и загрузкой сейва —
/// чтобы все растения собирались одинаково.
/// </summary>
public static class PlantFactory
{
    // Тинт рецессивной морфы (домножается на текстуру) — делает вариант визуально отличимым.
    private static readonly Color VariantTint = new(214, 150, 176);

    /// <summary>Создаёт растение вида <paramref name="species"/> с заданным возрастом и геномом.</summary>
    public static Entity Create(
        EntityStore store,
        PlantSet plants,
        int species,
        Vector2 position,
        float ageDays,
        in PlantGenome genome,
        float cellFertility,
        int cellSize
    )
    {
        var sp = plants[species];
        var stage = sp.StageAt(ageDays);
        var resolved = sp.Stages[stage];

        var sprite = new Sprite(resolved.Region, GameLayers.Beings);
        sprite.CenterOrigin();
        sprite.Color = genome.IsVariant ? VariantTint : Color.White;

        return store.CreateEntity(
            new Transform2D(
                position,
                scale: new Vector2(cellSize * resolved.SizeCells / resolved.Region.Width)
            ),
            sprite,
            new PlantGrowth
            {
                Species = species,
                Stage = stage,
                AgeDays = ageDays,
                CellFertility = cellFertility,
            },
            genome
        );
    }
}
