<?php

namespace AppBundle\Controller;

use //eZ\Bundle\EzPublishCoreBundle\Controller,
    Symfony\Bundle\FrameworkBundle\Controller\Controller,
	Symfony\Component\HttpFoundation\Request,
    Symfony\Component\HttpFoundation\Response,
    DateTime,
	Doctrine\ORM\QueryBuilder /*,
    eZ\Publish\API\Repository\Values\Content\Query,
    eZ\Publish\API\Repository\Values\Content\Query\Criterion,
    eZ\Publish\API\Repository\Values\Content\Query\SortClause*/
	;

class MapController extends Controller
{
   protected $templating;
    protected $repository;
    protected $queryBuilder;
    protected $locationService;
    protected $putCategories = false;

    public function ajaxAction(Request $request)
    {
		if( $request->request->has('event') ){
        	$result = $this->fetchEvents($request);
			
		}else if( $request->request->has('job') ){
        	$result = $this->fetchJobs($request);
			
		}else if( $request->request->has('applicant') ){
        	$result = $this->fetchApplicant($request);
			
		}else if( $request->request->has('interview') ){
			$result = $this->fetchInterviews($request);
			$response = new Response(json_encode($result));
        	return $response;
			
		}else{
        	$result = $this->fetchCompanies($request);
		}
		
		$data=array();
		
		if($request->request->has('event') ){
			 foreach($result as $r)
			 	$data[] = $this->extractEventData($r);
		}else if($request->request->has('job') ){
			 foreach($result as $r)
			 	$data[] = $this->extractJobData($r);
		}else if($request->request->has('applicant') ){
			 foreach($result as $r)
			 	$data[] = $this->extractApplicantData($r);
		}else{
			foreach($result as $r)
                 $data[] = $this->extractCompanyData($r);
			$data =$this->injectCategories($data);
		}
		
        $response = new Response(json_encode($data));
        return $response;
    }
	
   	protected function fetchEvents(Request $request)
    {
		// Event
		$this->repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Event');
		$text = $request->get('event');
		$criterions = $this->repository->createQueryBuilder('e');
		if( trim($text) != "" ) {
			$criterions ->where('e.title LIKE :name')
						->orWhere('e.description LIKE :name')
						->orWhere('e.organizer LIKE :name')
						->andWhere('e.published = true ')
						->setParameter('name', '%'.$text.'%');
		}else{
			$criterions = $this->repository->createQueryBuilder('e')->andWhere('e.published = true ');
		}
		
		if(trim($request->get('dateStart')) != ""&&trim($request->get('dateEnd')) != "" ){
			$date=  explode ("/" ,$request->get('dateStart'));
			$dateEnd=  explode ("/" ,$request->get('dateEnd'));
				$criterions
					->andWhere('e.date_start >= :ds1 AND e.date_start < :ds2 ')
					->orWhere('e.date_end >= :ds1 AND e.date_end <= :ds2')
					->setParameter('ds1',new \DateTime($date[2].'-'.$date[1] .'-'.$date[0].' 00:00:00'))
					->setParameter('ds2',new \DateTime($dateEnd[2].'-'.$dateEnd[1] .'-'.$dateEnd[0].' 23:59:59'));
		}
		elseif(trim($request->get('dateStart')) != ""){
				$date=  explode ("/" ,$request->get('dateStart'));
				$criterions->andWhere('e.date_start >= :ds1')->setParameter('ds1',new \DateTime($date[2].'-'.$date[1] .'-'.$date[0].' 00:00:00'));
		}elseif(trim($request->get('dateEnd')) != "" ){
				$date=  explode ("/" ,$request->get('dateEnd'));
				$criterions->andWhere('e.date_end <= :ds2 OR(e.date_end is NULL AND e.date_start <= :ds2)')
				->setParameter('ds2',new \DateTime($date[2].'-'.$date[1] .'-'.$date[0].' 23:59:59'));
		}elseif( null === $request->get('dateStart')&& null === $request->get('dateEnd') ){
				$criterions->andWhere('e.date_start >= :ds1 OR e.date_end > :ds1 ')
				->setParameter('ds1',new \DateTime("now"));
		}
		
		
		//$criterions = $this->repository->FindAll();
		return $criterions->getQuery()->getResult();
	}
	
   	protected function fetchInterviews(Request $request)
    {
		// Event
		$this->repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Interview');
		$result = $this->repository->FindBy(array('published'=>true));
		foreach($result as $content)
           $data[] = array(
            'id' => $content->getId(),
            'latitude' => $content->getLatitude(),
            'longitude' => $content->getLongitude(),
			'isInterview' => true,
			);
		return $data;
	}
	protected function fetchJobs(Request $request)
    {
		// Event
		$this->repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Job');
		$text = $request->get('job');
		if( trim($text) != "" ) {
			$criterions = $this->repository->createQueryBuilder('j')
										   
										   ->where('j.name LIKE :name')
										   ->orWhere('j.job_description LIKE :name')
										   ->orWhere('j.company LIKE :name')
										   ->setParameter('name', '%'.$text.'%')
										   ->andWhere('j.published = true')
										   ->getQuery()
										   ->getResult();
		}else{
			$criterions = $this->repository->FindBy(array('published'=>true));
		}
		return $criterions;
	}
	protected function fetchApplicant(Request $request)
    {
		// Applicant
		$this->repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Applicant');
		$qb = $this->repository->createQueryBuilder('ap');
		$qb->addOrderBy('ap.name', 'ASC');
		$expr=$qb->expr();
		
        $request = $request->request;
        $criterions = array(); 
		
		$text = $request->get('applicant');
		
		$criterions[]= $qb->expr()->eq('ap.published', true );
		if( trim($text) != "" ) {
            $criterions[]=$qb->expr()->like('ap.jobTitle', "'%".$text."%'" );
		}else{
			$criterions[]=$qb->expr()->gt('ap.id',  "-1" );
		}
		$qb->add('where', call_user_func_array(array($expr,"andX"),$criterions));
		// Fetch
        return $qb->getQuery()->getResult();
	}
	
    protected function fetchCompanies(Request $request)
    {
		$this->repository = $this->getDoctrine()->getManager()->getRepository('AppBundle:Compagny');
		$qb = $this->repository->createQueryBuilder('c');
		$qb->addOrderBy('c.name', 'ASC');
		$expr=$qb->expr();
		
        $request = $request->request;
        $criterions = array(); 
		
		if(count($request->keys())==0) $criterions[]=$qb->expr()->gt('c.id',  "-1" );
		
		// Name
        if( $request->has('name') ) {
			$text = $request->get('name');
			if( trim($text) != "" ) {
				$criterions[]=$qb->expr()->orX(
				   $qb->expr()->like('c.name',  "'%".$text."%'" ),
				   $qb->expr()->like('c.activity',  "'%".$text."%'" )
			   );
			}else
				$criterions[]=$qb->expr()->gt('c.id',  "-1" );
        }
		// Partners
        if( $request->has('partnername') ) {
            $this->putCategories = true;
           $criterions[]=$qb->expr()->orX(
                $qb->expr()->eq('c.partner', true ),
                $qb->expr()->eq( 'c.member', true )
            );
            $text = $request->get('partnername');
            if( trim($text) != "" ) {
                 $criterions[]=$qb->expr()->orX(
				   $qb->expr()->like('c.name',  "'%".$text."%'" ),
				   $qb->expr()->like('c.activity',  "'%".$text."%'" )
			   );
            }
        }
        // Sector
        if( $request->has('sector') ) {
			
			$sectorQuery = $this->getDoctrine()->getManager()->getRepository('AppBundle:Sector')->createQueryBuilder('s');
			$sectorQuery->where('s.markerId in ('.$request->get('sector').')');
			$selectIds =$sectorQuery->getQuery()->getArrayResult();
            $selectCriterions = array();
            foreach( $selectIds as $selectId ) {
                $selectCriterions[] = $qb->expr()->eq('c.sector', $selectId['id'] );
            }
			$criterions[] = call_user_func_array(array($expr,"orX"),$selectCriterions);
        }
        // Canton
        if( $request->has('canton') ) {
			$cantonQuery = $this->getDoctrine()->getManager()->getRepository('AppBundle:Canton')->createQueryBuilder('ca');
			$cantonQuery->where('ca.markerId in ('.$request->get('canton').')' );
			$selectIds =$cantonQuery->getQuery()->getArrayResult();
           // $selectIds = explode(',', $request->get('canton'));
            $selectCriterions = array();
            foreach( $selectIds as $selectId ) {
				$selectCriterions[] = $qb->expr()->eq('c.canton', $selectId['id'] );
            }
			$criterions[] = call_user_func_array(array($expr,"orX"),$selectCriterions);
        }
        
        // City
        if( $request->has('city') ) {
            $text = $request->get('city');
            if( trim($text) != "" ) {
                 $criterions[] = $qb->expr()->eq('c.city', $text );
            }
        }
		
		$qb->add('where', call_user_func_array(array($expr,"andX"),$criterions));
		// Fetch
        return $qb->getQuery()->getResult();
    }
	
    protected function extractCompanyData($content)
    {
        return array(
            'id' => $content->getId(),
            'name' => $content->getName(),
            'latitude' => $content->getLatitude(),
            'longitude' => $content->getLongitude(),
            'sectorId' => $content->getSector()->getMarkerId(),
            'member' => $content->getMember(),
            'partner' => $content->getPartner(),
            'className' => '',
            'isCategory' => false,
        );
    }
	
	protected function extractEventData($content)
    {
         return array(
            'id' => $content->getId(),
            'name' => $content->getTitle(),
            'latitude' => $content->getLatitude(),
            'longitude' => $content->getLongitude(),
            'className' => ' link_event',
            'isEvent' => true,
        );
    }
	protected function extractJobData($content)
    {
         return array(
            'id' => $content->getId(),
            'name' => $content->getName(),
            'latitude' => $content->getLatitude(),
            'longitude' => $content->getLongitude(),
            'className' => ' link_advert',
            'isAdvert' => true,
        );
    }
	protected function extractApplicantData($content)
    {
         return array(
            'id' => $content->getId(),
            'name' => $content->getjobTitle(),
            'latitude' => $content->getLatitude(),
            'longitude' => $content->getLongitude(),
            'className' => ' link_applicant',
            'isApplicant' => true,
        );
    }

    protected function injectCategories($companies)
    {
        if( !$this->putCategories ) {
            // Add Class name to differenciate members
            foreach( $companies as &$company ) {
                if( $company['partner'] ) {
                    $company['className'] = ' red';
                }
            }
            return $companies;
        }

        // Filter
        $partners = array();
        $members = array();
        foreach( $companies as $company ) {
            if( $company['member'] ) {
                $members[] = $company;
            }
            if( $company['partner'] ) {
                $partners[] = $company;
            }
        }

        // Merge
        $result = array();
        if( count($partners) ) {
            $result[] = array(
                'name' => 'Partenaires',
                'isCategory' => true
            );
            $result = array_merge($result, $partners);
        }
        if( count($members) ) {
           /* $result[] = array(
                'name' => 'Membres Bioalps',
                'isCategory' => true
            );*/
            //$result = array_merge($result, $members);
        }
        return $result;
    }

    public function companyAction(Request $request)
    {
        $response = new Response;
        $response->setMaxAge(0);
        $response->setSharedMaxAge(0);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $params = $request->query;
        if( $params->has('id') ) {
            return $this->render(
                'AppBundle:Ajax:company.html.twig',
                array('content' => $this->getDoctrine()->getManager()->getRepository('AppBundle:Compagny')->find($params->get('id'))),
                $response
            );
        }
        return $response;
    }
    public function eventAction(Request $request)
    {
        $response = new Response;
        $response->setMaxAge(0);
        $response->setSharedMaxAge(0);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $params = $request->query;
        if( $params->has('id') ) {
            return $this->render(
                'AppBundle:Ajax:event.html.twig',
                array('content' => $this->getDoctrine()->getManager()->getRepository('AppBundle:Event')->find($params->get('id')) ),
                $response
            );
        }
        return $response;
    } 
	
	public function applicantAction(Request $request)
    {
       $response = new Response;
        $response->setMaxAge(0);
        $response->setSharedMaxAge(0);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $params = $request->query;
        if( $params->has('id') ) {
            return $this->render(
                'AppBundle:Ajax:applicant.html.twig',
                array('content' => $this->getDoctrine()->getManager()->getRepository('AppBundle:Applicant')->find($params->get('id')) ),
                $response
            );
        }
        return $response;
    }
	public function advertAction(Request $request)
    {
       $response = new Response;
         $response->setMaxAge(0);
        $response->setSharedMaxAge(0);
        $response->headers->addCacheControlDirective('must-revalidate', true);
        $params = $request->query;
        if( $params->has('id') ) {
            return $this->render(
                'AppBundle:Ajax:advert.html.twig',
                array('content' => $this->getDoctrine()->getManager()->getRepository('AppBundle:Job')->find($params->get('id')) ),
                $response
            );
        }
        return $response;
    }
}
