import { world, system } from "@minecraft/server";

// ==========================================
// CONFIGURAÇÕES E WHITELIST
// ==========================================

const WHITELIST_MOBS = [
    "minecraft:villager",
    "minecraft:villager_v2",
    "minecraft:iron_golem",
    "minecraft:snow_golem",
    "minecraft:copper_golem",
    "minecraft:allay",
    "minecraft:cat",
    "minecraft:pillager",
    "minecraft:vindicator",
    "minecraft:evocation_illager",
    "minecraft:vex",
    "minecraft:ravager",
    "minecraft:wither_skeleton",
    "minecraft:blaze",
    "minecraft:warden",
    "minecraft:wither",
    "minecraft:ender_dragon"
];

let isSpawnWindowOpen = false;
let spawnTimerTicks = 0;

const BLOCKED_TICKS = 2 * 60 * 20; // 2 minutos bloqueado
const OPEN_TICKS = 20 * 20;        // 20 segundos liberado

// ==========================================
// FUNÇÕES AUXILIARES SEGURAS (BLINDAGEM)
// ==========================================

// Validador universal de entidade (suporta propriedade ou função)
function eValida(entidade) {
    if (!entidade) return false;
    try {
        if (typeof entidade.isValid === "boolean") return entidade.isValid;
        if (typeof entidade.isValid === "function") return entidade.isValid();
        return true;
    } catch {
        return false;
    }
}

// Extrai as famílias da entidade com segurança
function getFamiliesSafe(entidade) {
    if (!eValida(entidade)) return [];
    try {
        const comp = entidade.getComponent("minecraft:type_family");
        if (!comp) return [];
        
        if (typeof comp.getTypeFamilies === "function") {
            return comp.getTypeFamilies();
        }
    } catch {}
    return [];
}

// Checa imunidade por Whitelist (Proteção dupla: por ID e por Família)
function isWhitelisted(entidade) {
    if (!eValida(entidade)) return true;

    const typeId = entidade.typeId ? entidade.typeId.toLowerCase() : "";

    // 1. Checa por ID na whitelist
    if (WHITELIST_MOBS.includes(typeId)) return true;

    // 2. Checa por Família (Proteção absoluta para Villagers, Illagers, Golems, Players, etc)
    const families = getFamiliesSafe(entidade);
    if (
        families.includes("villager") ||
        families.includes("irongolem") ||
        families.includes("snowgolem") ||
        families.includes("cat") ||
        families.includes("allay") ||
        families.includes("illager") ||
        families.includes("player")
    ) {
        return true;
    }

    return false;
}

// ==========================================
// VERIFICA SE EXISTE UM SPAWNER PRÓXIMO
// ==========================================

function isNearSpawner(dimension, loc) {
    if (!dimension || !loc) return false;
    for (let x = -4; x <= 4; x++) {
        for (let y = -4; y <= 4; y++) {
            for (let z = -4; z <= 4; z++) {
                try {
                    const block = dimension.getBlock({ x: loc.x + x, y: loc.y + y, z: loc.z + z });
                    if (block && (block.typeId === "minecraft:mob_spawner" || block.typeId === "minecraft:trial_spawner")) {
                        return true;
                    }
                } catch (e) {}
            }
        }
    }
    return false;
}

// ==========================================
// CONTROLE DE SPAWN
// ==========================================

world.afterEvents.entitySpawn.subscribe((event) => {
    try {
        const entity = event.entity;

        // 1. Checa se a entidade existe e é válida
        if (!eValida(entity)) return;

        // 2. Trava para Add-ons: Processa apenas entidades nativas
        if (!entity.typeId || !entity.typeId.startsWith("minecraft:")) return;

        // 3. Trava da Whitelist (Se for um mob protegido, ignora totalmente)
        if (isWhitelisted(entity)) return;

        // 4. Se a janela de spawn estiver aberta, autoriza
        if (isSpawnWindowOpen) {
            try { entity.addTag("entitycap:entity_allowed"); } catch {}
            return;
        }

        // 5. Se já tem autorização prévia, ignora
        try {
            if (entity.hasTag("entitycap:entity_allowed")) return;
        } catch {}

        // 6. Permite farms por spawner
        try {
            if (isNearSpawner(entity.dimension, entity.location)) {
                entity.addTag("entitycap:entity_allowed");
                return;
            }
        } catch {}

        // 7. Remove a entidade fora da janela e sem autorização
        system.run(() => {
            try {
                if (eValida(entity)) {
                    entity.remove();
                }
            } catch (e) {}
        });
    } catch {}
});

// ==========================================
// TEMPORIZADOR
// ==========================================

system.runInterval(() => {
    spawnTimerTicks++;
    if (!isSpawnWindowOpen) {
        if (spawnTimerTicks >= BLOCKED_TICKS) {
            isSpawnWindowOpen = true;
            spawnTimerTicks = 0;
        }
    } else {
        if (spawnTimerTicks >= OPEN_TICKS) {
            isSpawnWindowOpen = false;
            spawnTimerTicks = 0;
        }
    }
}, 1);
