import { world, system, Player, GameMode } from '@minecraft/server';

// --- НАСТРОЙКИ МИНИ-ИГРЫ ---
const TARGET_MOB_ID = "mebesm:morph_pj_pug_a_pillar"; // <-- НОВЫЙ МОБ
const CHASE_MUSIC_ID = "pjchasetest";
const SEARCH_RADIUS = 30;
const CHECK_INTERVAL_TICKS = 20 * 5;
const IMMUNITY_TAG = "morph_pj_pug_a_pillar"; // <-- ТЕГ ИММУНИТЕТА

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

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; // Максимальное замедление/тьма
const MIN_SLOWNESS_AMPLIFIER = 0; // Минимальное замедление


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


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

/**
 * Применяет эффект с указанным усилителем.
 */
function applyEffect(player, effectName, durationTicks, amplifier) {
  if (!player.isValid()) return;

  player.addEffect(effectName, durationTicks, {
    amplifier: amplifier,
    showParticles: false
  });
}

/**
 * Снимает Слепоту и Тьму.
 */
function clearVisualEffects(players) {
  for (const player of players) {
    if (!player.isValid()) continue;
    player.removeEffect("blindness");
    player.removeEffect("darkness");
  }
}


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

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

  pugPillarEntity = entity;
  world.sendMessage(`§l§a[MINIGAME]§r Morph 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. Снятие всех эффектов
  for (const player of allPlayers) {
    if (!player.isValid()) continue;
    player.removeEffect("blindness");
    player.removeEffect("darkness");
    player.removeEffect("slowness"); // Снимаем slowness полностью
  }

  pugPillarEntity = undefined;

  world.sendMessage(`§l§c[MINIGAME]§r Morph 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 =>
      // 1. Исключаем игроков в креативе/наблюдении
      p.getGameMode() !== GameMode.creative &&
      p.getGameMode() !== GameMode.spectator
    )
    .filter(p =>
      // 2. ИСКЛЮЧАЕМ ИГРОКОВ С ТЕГОМ ИММУНИТЕТА
      !p.hasTag(IMMUNITY_TAG)
    );

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

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

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

  // 2. Применяем эффекты (МАКСИМАЛЬНЫЕ)
  for (const player of nearbyPlayers) {
    applyEffect(player, "blindness", DARK_PHASE_TICKS, EFFECT_AMPLIFIER);
    applyEffect(player, "darkness", DARK_PHASE_TICKS, EFFECT_AMPLIFIER);
    applyEffect(player, "slowness", DARK_PHASE_TICKS, EFFECT_AMPLIFIER);
  }


  // ----------------------------------------------------
  // ФАЗА 2: СВЕТ, МИН. ЗАМЕДЛЕНИЕ (6 секунд)
  // ----------------------------------------------------

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

    // 1. Снимаем Слепоту и Тьму
    clearVisualEffects(nearbyPlayers);

    // 2. Применяем МИНИМАЛЬНОЕ Замедление на длительность Фазы 2
    for (const player of nearbyPlayers) {
      applyEffect(player, "slowness", LIGHT_PHASE_TICKS, MIN_SLOWNESS_AMPLIFIER); // МИНИМАЛЬНОЕ ЗАМЕДЛЕНИЕ

      // 3. Запускаем музыку/звук
      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);
});