import { world, system, ItemStack } from "@minecraft/server";
import { LOOT_TABLES } from "../data/loot_tables.js";

export class Automation {
    /**
     * @param {OneBlockSystem} oneBlockSystem 
     * @param {Economy} economy 
     */
    constructor(oneBlockSystem, economy) {
        this.oneBlockSystem = oneBlockSystem;
        this.economy = economy;
        this.genTick = 0;
        this.minerTick = 0;
    }

    init() {
        // Generator: 1秒(20ticks)ごとにチェック
        // Normal: 10カウント(10秒) / Blitz: 2カウント(2秒)
        system.runInterval(() => this.tickGenerator(), 20);

        // Auto Miner: Blitzに合わせて 1.2秒(24ticks)ごとにチェック
        // Normal: 5カウント(6秒) / Blitz: 1カウント(1.2秒)
        system.runInterval(() => this.tickAutoMiner(), 24);
    }

    activateAutoMiner(player) {
        player.addTag("obw_auto_miner");
        
        // モードによってメッセージを変える
        const isBlitz = this.isBlitzMode();
        const interval = isBlitz ? "1.2s" : "6s";
        
        player.sendMessage(`§aAuto Miner activated! Items will spawn on your OneBlock every ${interval}.`);
        player.playSound("random.orb");
    }

    activateGenerator(player) {
        player.addTag("obw_generator");
        
        // モードによってメッセージを変える
        const isBlitz = this.isBlitzMode();
        const interval = isBlitz ? "2s" : "10s";

        player.sendMessage(`§aGenerator activated! You will earn §6$50 every ${interval}§a.`);
        player.playSound("random.orb");
    }

    onBlockBreak(event) {}

    isBlitzMode() {
        return this.oneBlockSystem && 
               this.oneBlockSystem.phaseManager && 
               this.oneBlockSystem.phaseManager.gameMode === "blitz";
    }

    tickGenerator() {
        this.genTick++;
        
        // Blitzなら2秒(2カウント)、Normalなら10秒(10カウント)
        const threshold = this.isBlitzMode() ? 2 : 10;
        
        if (this.genTick >= threshold) { 
            this.genTick = 0;
            
            // サドンデス中は無効
            if (this.oneBlockSystem.phaseManager && this.oneBlockSystem.phaseManager.currentPhase === 4) {
                return;
            }

            for (const player of world.getAllPlayers()) {
                if (player.hasTag("obw_generator")) {
                    this.economy.addMoney(player, 50);
                    player.playSound("random.orb", { volume: 0.3, pitch: 1.5 });
                    // 【V2.5 修正】アクションバー表示の競合(点滅)を防ぐため、通知を削除
                }
            }
        }
    }

    tickAutoMiner() {
        // サドンデス(フェーズ4)なら動作停止
        if (this.oneBlockSystem.phaseManager && this.oneBlockSystem.phaseManager.currentPhase === 4) {
            return;
        }

        this.minerTick++;
        
        // Blitzなら毎回(1.2秒)、Normalなら5回に1回(1.2s * 5 = 6.0s)
        const threshold = this.isBlitzMode() ? 1 : 5;

        if (this.minerTick >= threshold) {
            this.minerTick = 0;
            
            for (const player of world.getAllPlayers()) {
                if (!player.hasTag("obw_auto_miner")) continue;

                try {
                    const blockLoc = this.oneBlockSystem.getNearestHomeBlock(player);
                    if (!blockLoc) continue; 

                    const level = this.oneBlockSystem.getBlockLevel(blockLoc);
                    const lootTableKey = `level_${level}`;
                    const lootTable = LOOT_TABLES[lootTableKey] || LOOT_TABLES["level_1"];
                    const result = this.oneBlockSystem.weightedRandom(lootTable);
                    
                    // 【V2.4 修正】天井詰まり対策
                    // デフォルト: ブロックの1.5マス上
                    let spawnLoc = { x: blockLoc.x + 0.5, y: blockLoc.y + 1.5, z: blockLoc.z + 0.5 };
                    const dim = player.dimension;

                    // 出現位置がブロックで埋まっているか確認
                    try {
                        const blockAbove = dim.getBlock({ x: Math.floor(spawnLoc.x), y: Math.floor(spawnLoc.y), z: Math.floor(spawnLoc.z) });
                        if (blockAbove && blockAbove.typeId !== "minecraft:air") {
                            // 埋まっていたらさらに1マス上げる
                            spawnLoc.y += 1.0;
                            const blockAbove2 = dim.getBlock({ x: Math.floor(spawnLoc.x), y: Math.floor(spawnLoc.y), z: Math.floor(spawnLoc.z) });
                            
                            // それでも埋まっていたらプレイヤーの足元に出す
                            if (blockAbove2 && blockAbove2.typeId !== "minecraft:air") {
                                spawnLoc = { x: player.location.x, y: player.location.y + 0.5, z: player.location.z };
                            }
                        }
                    } catch(e) {
                        // チャンク未ロード等で取得失敗した場合は安全策でプレイヤー位置へ
                         spawnLoc = { x: player.location.x, y: player.location.y + 0.5, z: player.location.z };
                    }
                    
                    const itemStack = new ItemStack(result.id, 1);
                    player.dimension.spawnItem(itemStack, spawnLoc);
                    
                    try {
                         player.dimension.runCommand(`playsound random.pop @a ${spawnLoc.x} ${spawnLoc.y} ${spawnLoc.z}`);
                         player.dimension.spawnParticle("minecraft:basic_flame_particle", spawnLoc);
                    } catch(e) {}

                } catch (e) {
                    // エラーは無視
                }
            }
        }
    }
}