/* eslint-disable max-len */
/* eslint-disable require-jsdoc */
const nbt = require('prismarine-nbt');
const mcData = require('minecraft-data')('1.18.2');
const sleep = require('sleep-promise');
const chatMessage = require('prismarine-chat')('1.18.2');
const Vec3 = require('vec3');

const relativePosition = new Vec3(0, 0, 0);

function inject(bot, dcclient, config) {
  const core = {
    isCore(position) {
      return position.x >= core.start.x && position.x <= core.end.x && position.y >= core.start.y && position.y <= core.end.y && position.z >= core.start.z && position.z <= core.end.z;
    },
    run(command) {
      try {
        if (config.useChat &&
              command.startsWith('minecraft:tellraw @a ') &&
              !command.includes('Console') &&
              !command.includes('Discord')
        ) {
          bot.chat(chatMessage.fromNotch(command.replace('minecraft:tellraw @a ', '')).toMotd().replaceAll('\xa7', '&'));
          return;
        }

        relativePosition.x++;

        if (relativePosition.x >= 16) {
          relativePosition.x = 0;
          relativePosition.y++;
        }

        if (relativePosition.y >= config.core.layers) {
          relativePosition.y = 0;
          relativePosition.z++;
        }

        if (relativePosition.z >= 16) {
          relativePosition.z = 0;
        }

        const impulseMode = bot.options.host === '0.tcp.ap.ngrok.io';

        const location = {
          x: core.start.x + relativePosition.x,
          y: core.start.y + relativePosition.y,
          z: core.start.z + relativePosition.z,
        };

        if (impulseMode) bot.write('update_command_block', {location, command: command.substring(0, 32767), mode: 0, flags: 0});
        bot.write('update_command_block', {location, command: command.substring(0, 32767), mode: impulseMode ? 2 : 1, flags: 0b100});
      } catch (e) {
        bot.console.error(e);
      }
    },
    async loopPlace() {
      try {
        const fillCommand = `/minecraft:fill ${core.start.x} ${core.start.y} ${core.start.z} ${core.end.x} ${core.end.y} ${core.end.z} command_block${config.core.customName ? `{CustomName:'${JSON.stringify(config.core.customName)}'}` : ''}`;
        const location = {x: Math.floor(bot.position.x), y: Math.floor(bot.position.y) - 1, z: Math.floor(bot.position.z)};
        bot.write('set_creative_slot', {
          slot: 36,
          item: {
            present: true,
            itemId: mcData.itemsByName['repeating_command_block'].id,
            itemCount: 64,
            nbtData: nbt.comp({BlockEntityTag: nbt.comp({
              Command: nbt.string(fillCommand),
              auto: nbt.byte(1),
              TrackOutput: nbt.byte(0),
            })}),
          },
        });
        await sleep(50);
        bot.write('block_dig', {
          status: 0,
          location,
          face: 1,
        });
        await sleep(50);
        bot.write('block_place', {
          location,
          direction: 1,
          hand: 0,
          cursorX: 0.5,
          cursorY: 0.5,
          cursorZ: 0.5,
          insideBlock: false,
        });
      } catch (e) {
        bot.console.error(e);
      }
    },
    // fillCore(useCore) {
    //   const fillCommand = `/minecraft:fill ${core.start.x} ${core.start.y} ${core.start.z} ${core.end.x} ${core.end.y} ${core.end.z} command_block{CustomName:'{"text":"ChomeNS Bot Core","color":"yellow"}'}`;
    //   if (useCore==true) {
    //     bot.core.run(fillCommand);
    //   } else {
    //     bot.chat(fillCommand);
    //   }
    //   bot.emit('core_filled');
    // },
  };

  function fillCore() {
    core.start = new Vec3(
        Math.floor(bot.position.x / 16) * 16,
        0 /* bot.position.y */,
        Math.floor(bot.position.z / 16) * 16,
    ).floor();
    core.end = core.start.clone().translate(16, config.core.layers, 16).subtract(new Vec3(1, 1, 1));

    bot.core.loopPlace();
    // core.fillCore();
  }

  bot.on('position', fillCore);

  const interval = setInterval(() => fillCore(), config.core.refillInterval);

  // bot._client.on('block_change', (packet) => {
  //   if (core.isCore(packet.location) && packet.type === 0) fillCore();
  // });

  // bot._client.on('multi_block_change', (packet) => {
  //   if (core.start === packet.chunkCoordinates || core.end === packet.chunkCoordinates) fillCore();
  // });

  bot.on('end', () => {
    clearInterval(interval);
  });

  bot.core = core;
}

module.exports = {inject};