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

namespace LittleSim.Sim;

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

    // Якоря оттенка листвы: тёплый жёлто-зелёный → холодный сине-зелёный (по гену leafHue).
    private static readonly Color LeafWarm = new(170, 200, 90);
    private static readonly Color LeafCool = new(90, 170, 150);

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

        var sprite = new Sprite(resolved.Region, GameLayers.Beings);
        sprite.CenterOrigin();
        sprite.Color = Tint(traits);

        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,
            },
            new PlantOrganism { Genome = genome, Traits = traits },
            new Fruiting(),
            new TemperatureStress()
        );
    }

    // Цвет растения из генов: лёгкий оттенок листвы (ген leafHue) поверх текстуры; рецессивная морфа
    // дополнительно сдвигает тинт в свою сторону.
    private static Color Tint(in PlantPhenotype traits)
    {
        var leaf = Color.Lerp(LeafWarm, LeafCool, Math.Clamp(traits.LeafHue, 0f, 1f));
        var tint = Color.Lerp(Color.White, leaf, 0.35f);
        return traits.IsVariant ? Color.Lerp(tint, VariantTint, 0.6f) : tint;
    }
}
