package engine.objects;

import engine.InterestManagement.WorldGrid;
import engine.gameManager.ArenaManager;
import engine.gameManager.ChatManager;
import engine.gameManager.MovementManager;
import engine.math.Vector3fImmutable;
import engine.server.MBServerStatics;

import java.util.HashSet;

public class Arena {
    public PlayerCharacter player1;
    public PlayerCharacter player2;
    public Long startTime;
    public Vector3fImmutable loc;

    public Arena(){

    }
    public Boolean disqualify() {
        HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER);
        HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER);
        for(AbstractWorldObject obj : warningRange){
            PlayerCharacter pc = (PlayerCharacter)obj;
            if(pc.equals(this.player1) || pc.equals(this.player2))
                continue;

            ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!");
        }
        //boot out all non competitors
        for(AbstractWorldObject obj : inRange){
            if(obj.equals(this.player1))
                continue;

            if(obj.equals(this.player2))
                continue;

            PlayerCharacter intruder = (PlayerCharacter)obj;
            MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079)));
        }

        if (!inRange.contains(this.player1) && inRange.contains(this.player2)) {
            ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena");
            return true;
        } else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) {
            ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena");
            return true;
        }else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) {
            ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena");
            return true;
        }
        return false;
    }

    public Boolean checkToComplete(){

        if(this.startTime == null)
            this.startTime = System.currentTimeMillis();

        if(System.currentTimeMillis() - this.startTime < 10000L)
            return false;

        if(this.disqualify())
            return true;

        if(!this.player1.isAlive() && this.player2.isAlive()){
            ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died");
            return true;
        } else if(this.player1.isAlive() && !this.player2.isAlive()){
            ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died");
            return true;
        } else if(!this.player1.isAlive() && !this.player2.isAlive()){
            ArenaManager.endArena(this,null,null,"Both Players Have Died");
            return true;
        } else if(this.startTime + 300000L < System.currentTimeMillis()){
            ArenaManager.endArena(this,null,null,"Time Has Elapsed");
            return true;
        }
        return false;
    }
}