import { world, system, Player, GameMode } from '@minecraft/server'; // Импорт GameMode

// --- НАСТРОЙКИ МИНИ-ИГРЫ ---
const TARGET_MOB_ID = "mebesm:pj_pug_a_pillar";
const CHASE_MUSIC_ID = "pjchasetest";
const SEARCH_RADIUS = 30;
const CHECK_INTERVAL_TICKS = 20 * 5;

// Длительность фаз
const DARK_PHASE_SECONDS = 3; // 3 секунды для Тьмы/Замедления
const LIGHT_PHASE_SECONDS = 6; // 6 секунд для Света/Музыки

const DARK_PHASE_TICKS = 20 * DARK_PHASE_SECONDS;
const LIGHT_PHASE_TICKS = 20 * LIGHT_PHASE_SECONDS;

// Полная длительность цикла
const CYCLE_DURATION_TICKS = DARK_PHASE_TICKS + LIGHT_PHASE_TICKS;

// Максимальный уровень для эффектов (Тьма, Слепота, Замедление)
const EFFECT_AMPLIFIER = 255;


// --- ПЕРЕМЕННЫЕ СОСТОЯНИЯ ---
let minigameIntervalId = undefined;
let pugPillarEntity = undefined;


// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ЭФФЕКТОВ ---

function applyVisualEffects(players, durationTicks) {
  for (const player of players) {
    if (!player.isValid()) continue;

    player.addEffect("blindness", durationTicks, {
      amplifier: EFFECT_AMPLIFIER,
      showParticles: false
    });
    player.addEffect("darkness", durationTicks, {
      amplifier: EFFECT_AMPLIFIER,
      showParticles: false
    });
    player.addEffect("slowness", durationTicks, {
      amplifier: EFFECT_AMPLIFIER,
      showParticles: false
    });
  }
}

function clearVisualEffects(players) {
  for (const player of players) {
    if (!player.isValid()) continue;
    player.removeEffect("blindness");
    player.removeEffect("darkness");
    player.removeEffect("slowness");
  }
}


// --- ФУНКЦИИ ЗАПУСКА/ОСТАНОВКИ ---

function startMinigame(entity) {
  if (minigameIntervalId !== undefined) return;

  pugPillarEntity = entity;
  // §l - жирный, §a - зеленый цвет
  world.sendMessage(`§l§a[MINIGAME]§r Pug minigame started!`); // ЗЕЛЕНЫЙ

  runMinigameCycle();
  minigameIntervalId = system.runInterval(runMinigameCycle, CYCLE_DURATION_TICKS);
}

function stopMinigame() {
  if (minigameIntervalId === undefined) return;

  system.clearRun(minigameIntervalId);
  minigameIntervalId = undefined;

  const allPlayers = world.getAllPlayers();

  // 1. Остановка музыки
  try {
    world.getDimension("overworld").runCommandAsync(`stopsound @a ${CHASE_MUSIC_ID}`);
  } catch (e) { }

  // 2. Снятие эффектов
  clearVisualEffects(allPlayers);

  pugPillarEntity = undefined;

  // §l - жирный, §c - красный цвет
  world.sendMessage(`§l§c[MINIGAME]§r Pug minigame stopped.`); // КРАСНЫЙ
}


// --- ОСНОВНОЙ ЦИКЛ МИНИ-ИГРЫ ---

function runMinigameCycle() {
  if (!pugPillarEntity || !pugPillarEntity.isValid()) {
    stopMinigame();
    return;
  }

  const dimension = pugPillarEntity.dimension;

  const playersQuery = {
    type: "minecraft:player",
    location: pugPillarEntity.location,
    maxDistance: SEARCH_RADIUS,
  };

  const nearbyEntities = dimension.getEntities(playersQuery);

  // ФИЛЬТРУЕМ ИГРОКОВ: оставляем только тех, кто в Выживании или Приключении
  const nearbyPlayers = nearbyEntities
    .filter(e => e instanceof Player)
    .filter(p =>
      p.getGameMode() !== GameMode.creative &&
      p.getGameMode() !== GameMode.spectator
    );

  if (nearbyPlayers.length === 0) return;

  // ----------------------------------------------------
  // ФАЗА 1: ТЕМНОТА, ЗАМЕДЛЕНИЕ (3 секунды)
  // ----------------------------------------------------

  // 1. ОСТАНОВКА ЗВУКА
  try {
    dimension.runCommandAsync(`stopsound @a ${CHASE_MUSIC_ID}`);
  } catch (e) { }

  // 2. Применяем эффекты
  applyVisualEffects(nearbyPlayers, DARK_PHASE_TICKS);


  // ----------------------------------------------------
  // ФАЗА 2: СВЕТ, РАЗБЛОКИРОВКА (6 секунд)
  // ----------------------------------------------------

  system.runTimeout(() => {
    if (!pugPillarEntity || !pugPillarEntity.isValid()) return;

    // 1. Снимаем все эффекты
    clearVisualEffects(nearbyPlayers);

    // 2. Запускаем музыку/звук
    for (const player of nearbyPlayers) {
      if (!player.isValid()) continue;
      player.playSound(CHASE_MUSIC_ID, {
        volume: 5.0,
        pitch: 1.0,
        location: player.location
      });
    }
  }, DARK_PHASE_TICKS);
}


// --- ОТСЛЕЖИВАНИЕ МОБА И ЗАПУСК ---

function checkPugPillarStatus() {
  if (pugPillarEntity) {
    if (!pugPillarEntity.isValid()) {
      stopMinigame();
    }
    return;
  }

  const query = { type: TARGET_MOB_ID, limit: 1 };
  const dimensions = [
    world.getDimension("overworld"),
    world.getDimension("nether"),
    world.getDimension("the_end")
  ];

  for (const dim of dimensions) {
    const entities = dim.getEntities(query);
    if (entities.length > 0) {
      startMinigame(entities[0]);
      return;
    }
  }
}

world.afterEvents.worldInitialize.subscribe(() => {
  system.runInterval(checkPugPillarStatus, CHECK_INTERVAL_TICKS);
});