export class Weather {
    constructor(game) {
        this.game = game;
        this.current = 'clear';     // clear | rain | snow | fog
        this.temperature = 15;       // °C
        this.changeTimer = 0;
        this.changeCooldown = 180;   // секунд реальных между сменами погоды
        this.windStrength = 0;
    }

    init() {
        this.current = 'clear';
        this.temperature = 15;
        this.changeTimer = 60 + Math.random() * 120;
    }

    update(dt) {
        this.changeTimer -= dt;

        if (this.changeTimer <= 0) {
            this.changeWeather();
            this.changeTimer = this.changeCooldown + Math.random() * 120;
        }

        // Температура зависит от времени суток, погоды и сезона
        const hour = this.game.gameTime / 60;
        let baseTemp;
        if (hour >= 10 && hour < 16) {
            baseTemp = 18;
        } else if (hour >= 6 && hour < 10) {
            baseTemp = 10;
        } else if (hour >= 16 && hour < 21) {
            baseTemp = 12;
        } else {
            baseTemp = 3;
        }

        // Сезонный модификатор температуры
        baseTemp += this.game.seasons.getTemperatureModifier();

        if (this.current === 'rain') baseTemp -= 5;
        if (this.current === 'snow') baseTemp -= 15;
        if (this.current === 'fog') baseTemp -= 2;

        this.temperature += (baseTemp - this.temperature) * dt * 0.1;

        // Влияние на тепло игрока
        this.applyEffects(dt);

        // Ветер
        this.windStrength = (this.current === 'rain' || this.current === 'snow') ?
            0.3 + Math.sin(Date.now() * 0.001) * 0.2 : 0.05;
    }

    changeWeather() {
        // Веса погоды зависят от сезона
        const weights = this.game.seasons.getWeatherWeights();
        const hour = this.game.gameTime / 60;

        // Ночью больше тумана и снега
        if (hour < 6 || hour > 21) {
            weights.fog += 2;
            weights.snow += 1;
        }

        // Строим массив с весами
        const pool = [];
        for (const [type, w] of Object.entries(weights)) {
            for (let i = 0; i < w; i++) pool.push(type);
        }

        let newWeather;
        do {
            newWeather = pool[Math.floor(Math.random() * pool.length)];
        } while (newWeather === this.current && pool.length > 1);

        this.current = newWeather;
        this.game.particles.setWeather(newWeather);

        // Визуальные эффекты тумана
        if (newWeather === 'fog') {
            this.game.scene.fog.near = 10;
            this.game.scene.fog.far = 50;
        } else {
            this.game.scene.fog.near = 80;
            this.game.scene.fog.far = 200;
        }

        const names = { clear: 'Ясно', rain: 'Дождь', snow: 'Снег', fog: 'Туман' };
        this.game.notify(`Погода: ${names[newWeather]} (${Math.round(this.temperature)}°C)`);
    }

    applyEffects(dt) {
        const player = this.game.player;
        const seasonDrain = this.game.seasons.getWarmthDrain();

        if (this.current === 'rain') {
            player.stats.warmth = Math.max(0, player.stats.warmth - 0.08 * seasonDrain * dt);
            player.stats.mood = Math.max(0, player.stats.mood - 0.03 * dt);
        }

        if (this.current === 'snow') {
            player.stats.warmth = Math.max(0, player.stats.warmth - 0.15 * seasonDrain * dt);
            player.stats.mood = Math.max(0, player.stats.mood - 0.05 * dt);
        }

        // Холодная температура
        if (this.temperature < 5) {
            player.stats.warmth = Math.max(0, player.stats.warmth - 0.1 * seasonDrain * dt);
        }
    }

    getIcon() {
        const icons = { clear: '☀️', rain: '🌧️', snow: '❄️', fog: '🌫️' };
        return icons[this.current] || '☀️';
    }

    reset() {
        this.init();
    }
}
