/**
 * Вьюхи теней поверх чистой математики shadowSim: текстура блоба
 * (ступенчатый эллипс — мягкий край без мыла, пиксель-стиль) и раскладка
 * спрайта по размещению из blobPlacement. Тонко: состояние считает сцена.
 */
import { Graphics, Sprite, Texture } from 'pixi.js';
import { type BlobPlacement } from './shadowSim';
import { SHADOW_COLOR } from './shadowSim';
import { type Renderer } from './Renderer';

/** Полуось текстуры блоба, px виртуального разрешения (масштабируется спрайтом). */
export const SHADOW_TEX_PX = 32;

/** Текстура блоба-тени: три ступени прозрачности от края к центру. */
export function makeShadowTexture(renderer: Renderer): Texture {
    const g = new Graphics();
    g.ellipse(0, 0, SHADOW_TEX_PX, SHADOW_TEX_PX).fill({ color: SHADOW_COLOR, alpha: 0.34 });
    g.ellipse(0, 0, SHADOW_TEX_PX * 0.72, SHADOW_TEX_PX * 0.72).fill({ color: SHADOW_COLOR, alpha: 0.36 });
    g.ellipse(0, 0, SHADOW_TEX_PX * 0.45, SHADOW_TEX_PX * 0.45).fill({ color: SHADOW_COLOR, alpha: 0.3 });
    const tex = renderer.app.renderer.generateTexture({ target: g, resolution: 1 });
    g.destroy();
    return tex;
}

/**
 * Положить спрайт-блоб (текстура makeShadowTexture) по размещению blobPlacement:
 * base — точка базы объекта (ноги/основание) в координатах родителя.
 */
export function applyBlobShadow(
    sprite: Sprite,
    base: { x: number; y: number },
    blob: BlobPlacement
): void {
    sprite.position.set(base.x + blob.x, base.y + blob.y);
    sprite.rotation = blob.rotation;
    sprite.scale.set(blob.scaleX / SHADOW_TEX_PX, blob.scaleY / SHADOW_TEX_PX);
    sprite.alpha = blob.alpha;
}