// PlayerArray.cpp: implementation of the PlayerArray class.
//
//////////////////////////////////////////////////////////////////////

#include "PlayerArray.h"
#include "Common/World/Circle.h"
#include <assert.h>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

PlayerArray::PlayerArray()
{}

PlayerArray::~PlayerArray()
{}

PlayerArray::PlayerArray(const PlayerArray &other) 
{
	for (int i=0; other.GetSize(); i++)
		Add(other[i]);
}

int PlayerArray::FindByUniformIndex(int uniform) const
{
	if(uniform == 0) return -1;

	for(int i = 0; i < GetSize(); i++)
	{
		if(this->operator [](i).GetUniform() == uniform) return i;
	}

	return -1;
}

int PlayerArray::FindByPosIndex(Point pos, float fMaxRadius) const
{
	Circle c;
	c.SetRadius(fMaxRadius);
	for(int i = 0; i < GetSize(); i++)
	{
		c.SetCenter(this->operator [](i).pos);
		if(c.IsInside(pos)) return i;
	}

	return -1;
}

int PlayerArray::FindNearestToPosIndex(Point pos)
{
	if (GetSize()==0) return -1;
	
	float dest=1000000.0;		//velmi daleko;
	float aDest;
	int index=-1;
	for (int i=0; i<GetSize(); i++)
    {
        aDest = (this->operator[](i).pos - pos).GetLength();
        if (dest>aDest)
        {
            index = i;
            dest = aDest;
        }
    }
	return index;
}


/*! \brief Zisti, ci je niektory hrac maximalne maxDist od ciary l
 *  \param l Ciara voci ktorej sa urcuje ci situacia nastala.
 *  \param maxDist maximalna vzdialenost od ciary
 *  \param idx Prvy hrac, ktory je blizsie ako maxDist
 *  \return \li true ak je niekto blizsie ako maxDist
 *			\li false ak nikto nie je tak blizko ciary
 */
bool PlayerArray::IsAnyNearLine(Line &l, float maxDist, int &idx)
{
	bool result = false;
	idx = -1;
	for (int i=0; i<GetSize(); i++)
	{
		float minDist = l.DistanceToPoint(this->operator [](i).pos);
		if (minDist< maxDist)
		{
			idx = i;
			result = true;
			break;
		}
	}
	return result;
}

/*! \brief Zisti, ci je niektory hrac maximalne maxDist od usecky a
 *  \param a Usecka voci ktorej sa urcuje ci situacia nastala.
 *  \param maxDist maximalna vzdialenost od ciary
 *  \param idx Prvy hrac, ktory je blizsie ako maxDist
 *  \return \li true ak je niekto blizsie ako maxDist
 *			\li false ak nikto nie je tak blizko ciary
 */
bool PlayerArray::IsAnyNearAbscisse(const Abscisse &a, float maxDist)
{
	bool result = false;
	int idx = -1;
	Point playerPos;
	for (int i=0; i<GetSize(); i++)
	{
		playerPos = this->operator [](i).pos;
		Abscisse p = a.ParallelPerp(playerPos);
		
		float minDist = a.DistanceToPoint(playerPos);
		
		if (minDist<maxDist && p.IsOnAbscisse(playerPos)==true)
		{
			idx = i;
			result = true;
			break;
		}
	}
	return result;
}