package gui.render;

import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import events.EntityHitboxChangedEvent;
import events.EntityHitboxChangedListener;
import model.Entity;
import model.HitboxCircle;
import model.Point;

public class HitboxCircleRenderingFunction implements ShapeRenderingFunction {
	Point firstIsoPoint = null;
	Point currentIsoPoint = new Point(0,0);
	int currentDiametrX=0;
	Entity entity;
	private List<EntityHitboxChangedListener> listeners = new ArrayList<>();
	
	public void setEntityInHitboxCircle(Entity e) {
		entity = e;	
	}
	
	@Override
	public void drawing(Graphics2D g) {
		HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox();
		if(nowHitbox.getRadius()!=0) {
			g.drawOval((int)nowHitbox.getCurrentRefPoint().x, (int)(nowHitbox.getCurrentRefPoint().y-(nowHitbox.getDiametrY()/2)), (int)nowHitbox.getDiametrX(), (int)(nowHitbox.getDiametrY()));
//			System.out.println("READY: diametrX = "+nowHitbox.getDiametrX()+ ". diametrY = "+nowHitbox.getDiametrY());
//			System.out.println("READY: coordX = "+(int)nowHitbox.getCurrentRefPoint().x+ ". coordY = "+(int)(nowHitbox.getCurrentRefPoint().y-(nowHitbox.getDiametrY()/2)));
			
		}else if(firstIsoPoint != null) {
			currentDiametrX = Math.abs((int)firstIsoPoint.x-(int)currentIsoPoint.x);
//			System.out.println("CURRENT: coordX = "+(int)firstIsoPoint.x+ ". coordX = "+(int)(firstIsoPoint.y-currentDiametrX/4));
//			System.out.println("CURRENT: diametrX = "+currentDiametrX+ ". diametrY = "+currentDiametrX/2);
			g.drawOval((int)firstIsoPoint.x, (int)(firstIsoPoint.y-currentDiametrX/4), (int)currentDiametrX, (int)currentDiametrX/2); 
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
		HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox();
		if(nowHitbox.getRadius()==0 && firstIsoPoint == null) {
			firstIsoPoint = new Point(e.getX(), e.getY());
		}else if(nowHitbox.getRadius()==0 && firstIsoPoint != null) {
			//Формула высчитывания радиуса из диаметров circle.
			nowHitbox.getCurrentRefPoint().setXY(firstIsoPoint.x, firstIsoPoint.y);
			nowHitbox.setDiametrXY(Math.abs(firstIsoPoint.x-e.getX()),Math.abs((firstIsoPoint.x-e.getX())/2));
			System.out.println("X = "+nowHitbox.getDiametrX()+ ". Y = "+nowHitbox.getDiametrY());
			float temp = (float)Math.sqrt(2);
			nowHitbox.setRadius((nowHitbox.getDiametrY()/2)*temp);
			// высчитываем в параметры хитбокссеркла нужный радиус и текущую реф поинт.
			// Не забываем высчитать реф поинт хитбокса относительно текущей.
			// после чего вызываем listPointsToString и нотифай, который отправляет данные на сохранение
			notifySubscribers();
			//возвращаем локальные данные текущего рисования хитбокса в нулевые значения.
			//необходимо, что бы при переходе в новый обьект, при создании хитбокса, очистился кэш канваса.
			firstIsoPoint = null;
			currentDiametrX = 0;
		}
		
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		currentIsoPoint.x = e.getX();
		currentIsoPoint.y = e.getY();
	}

	public void functionClearHitboxJButton() {
		HitboxCircle nowHitbox = (HitboxCircle)entity.getHitbox();
	}

	@Override
	public void functionClearJButton() {
		firstIsoPoint = null;
		currentIsoPoint = new Point(0,0);
		currentDiametrX = 0;
		HitboxCircle nowhitbox = (HitboxCircle)entity.getHitbox();
		nowhitbox.setRadius(0);
		System.err.println("radius: "+nowhitbox.getRadius());
	}
	
	public void subscribe(EntityHitboxChangedListener listener) {
        listeners.add(listener);
	}
	
	public void unsubscribe(EntityHitboxChangedListener listener) {
        listeners.remove(listener);
	}
	
	private void notifySubscribers() {
		for (EntityHitboxChangedListener listener : listeners) {
			listener.hitboxChanged(
				new EntityHitboxChangedEvent(entity.getHitbox(), entity)
			);
		}
	}
	
}
