'use strict';

const conf = require('../conf');
const {sleep} = require('../utils');


function faceEntity(bot, entity) {
	if (!entity) return; // Check if entity is valid

	const targetPosition = entity.position.offset(0, entity.height * 0.5, 0); // Focus on the middle of the entity
	bot.bot.lookAt(targetPosition);
}

class Swing{
	constructor(args){
		this.bot = args.bot;
		this.target = args.target;
		this.interval = args.interval;
		this.intervalStop;
		this.isDangerous = true;
		this.isAction = true;
	}

	async init(){
		this.onReadyListen = this.bot.on('onReady', async ()=>{
			console.log('Swing.init onReady called');
			try{
				this.block = this.bot.findBlockBySign('guardian\nattack spot');
				await this.goToSpot();
				await this.swing();
			}catch(error){
				console.error('Error in Swing.init:', error)
			}
		});

		return true;
	}

	unload(){
		console.log('Swing.unload');
		clearInterval(this.intervalStop);
		this.intervalStop = null;
		this.onReadyListen();

		return true;
	}

	async goToSpot(){
		await this.bot.goTo({
			where: this.block,
			range: 3,
		});
	}

	async swing(){
		this.intervalStop = setInterval(async ()=>{
			try{
				let entity = this.bot.bot.nearestEntity(entity =>{
					// console.log('looking for entity name', entity.name, entity.name?.toLowerCase());
					return entity.name?.toLowerCase() === "guardian"
				});

				if(entity && this.bot.isWithinRange(entity.position, 3)){
					faceEntity(this.bot, entity);
					await this.bot.bot.attack(entity);
				}
			}catch(error){
				console.log('Swing.swing interval error:', error);
			}
		}, 500);
	}
}

Swing.getStatus = function(instance) {
	return { active: !!instance.intervalStop, target: 'guardian' };
};

module.exports = Swing;
