<?php 
namespace App\Controller; 
 
use Symfony\Component\Routing\Annotation\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\HttpFoundation\Session\SessionInterface; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Doctrine\ORM\EntityManagerInterface; 
use Symfony\Component\HttpFoundation\Request; 
use JMS\Serializer\SerializerBuilder; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Routing\RouterInterface; 
 
use App\Entity\LocationsFossil; 
use App\Entity\Countries; 
use App\Entity\Newsfeed; 
use App\Entity\User; 
use App\Entity\UserProfile; 
use App\Entity\LocationsGIS; 
use App\Entity\LocationsGISNearby; 
use App\Entity\Spool; 
use App\Entity\SearchItems; 
 
use App\Repository\LocationsFossilRepository; 
 
use App\Form\LocationsFossilFormType; 
use App\Form\LocationsUserFossilFormType; 
use App\Form\LocationFilterSearchFormType; 
 
use Symfony\Contracts\Translation\TranslatorInterface; 
 
class LocationsFossilController extends AbstractController  
{ 
    private $session; 
    private $em; 
    private $translator; 
    private $router; 
 
    public function __construct(EntityManagerInterface $em, TranslatorInterface $translator, RouterInterface $router, SessionInterface $session) 
    { 
        $this->em = $em; 
        $this->translator = $translator; 
        $this->router = $router; 
        $this->session = $session; 
    } 
 
    private function get_locations_fossil_new(TranslatorInterface $translator) { 
        $repository = $this->getDoctrine()->getRepository(LocationsFossil::class); 
        $new = $repository->findBy(array('approved' => 0),array('num_new_photos' => 'DESC', 'num_reviews' => 'DESC', 'location' => 'ASC')); 
        return $new; 
    } 
 
    private function get_locations_fossil_approved(TranslatorInterface $translator) { 
        $repository = $this->getDoctrine()->getRepository(LocationsFossil::class); 
        $approved = $repository->findBy(array('approved' => 1),array('num_new_photos' => 'DESC', 'num_reviews' => 'DESC', 'location' => 'ASC')); 
        return $approved; 
    } 
 
    private function get_locations_fossil_filtered($filter) { 
        $qb = $this->em->createQueryBuilder('l') 
            ->from('App\Entity\LocationsFossil', 'l') 
            ->addSelect('l') 
            ->orderBy('l.id','DESC') 
            ->AddOrderBy('l.approved','DESC') 
            ->AddOrderBy('l.num_new_photos','DESC') 
            ->AddOrderBy('l.num_reviews','ASC') 
        ; 
 
        if($filter['property'] == 'new') { 
            $qb->andWhere("l.approved = 0"); 
        } 
        elseif($filter['property'] == 'reviews') { 
            $qb->andWhere("l.num_reviews > 0"); 
        } 
        elseif($filter['property'] == 'photos') { 
            $qb->andWhere("l.num_new_photos > 0"); 
        } 
 
        $result = $qb->getQuery()->getResult(); 
        return $result; 
    } 
 
    private function get_locations_fossil_by_id(int $id) { 
        $repository = $this->getDoctrine()->getRepository(LocationsFossil::class); 
        $item = $repository->findOneBy(array('id'=>$id)); 
        return $item; 
    } 
 
    /** 
     * @Route("/locations/fossil/{id}" , name="locations_fossil") 
     */ 
    public function index(LocationsFossil $fossil, TranslatorInterface $translator, EntityManagerInterface $em) 
    { 
        if($this->getUser() == null){ 
            $filterby['vulnerability'] = array('public'); 
        } else { 
            $vulnerability = $this->getUser()->getCanSeeVulnerability(); 
            if($vulnerability == 'very') { $filterby['vulnerability'] = array('public','slightly','moderate','very'); } 
            elseif($vulnerability == 'moderate') { $filterby['vulnerability'] = array('public','slightly','moderate'); } 
            elseif($vulnerability == 'slightly') { $filterby['vulnerability'] = array('public','slightly'); } 
            else { $filterby['vulnerability'] = array('public'); } 
        } 
        $filterby['approved'] = 1; 
        $filterby['fossil'] = $fossil; 
 
        $repository = $this->getDoctrine()->getRepository(LocationsGIS::class); 
        $gis = $repository->findBy($filterby); 
 
        if($fossil->getApproved() == 0 || empty($gis) ) { 
            return $this->render('error_message.html.twig', [ 
                'error_title' => $translator->trans("Fout"), 
                'error_message' => $translator->trans("Deze locatie bestaat niet of je hebt geen rechten deze in te zien."), 
            ]); 
        } 
 
        #ToDo-Ante: alleen voor deze locatie, niet voor allen 
        $qb = $em->createQueryBuilder('f') 
            ->from('App\Entity\FossildbFossil', 'f') 
            ->select('count(f.id)') 
            ->andWhere('f.location_fossil = (:fossil_id)') 
            ->andWhere('f.approved = 1') 
            ->setParameter('fossil_id', $fossil->getId()); 
        $fossils_found = $qb->getQuery()->getSingleScalarResult(); 
 
        /*$query = $em->createQuery('SELECT lg FROM App\Entity\LocationsGIS lg WHERE lg.center_lat BETWEEN :find_latmin AND :find_latmax AND lg.center_lng BETWEEN :find_lngmin AND :find_lngmax ORDER BY lg.type'); //AND lg.fossil != :fossil_id 
        $query->setParameter('find_latmin', $gis[0]->getCenterLat()-0.5); 
        $query->setParameter('find_latmax', $gis[0]->getCenterLat()+0.5); 
        $query->setParameter('find_lngmin', $gis[0]->getCenterLng()-0.5); 
        $query->setParameter('find_lngmax', $gis[0]->getCenterLng()+0.5); 
        //$query->setParameter('fossil_id', $fossil->getId()); 
        $gis_locations_nearby = $query->getResult(); 
        dd($gis_locations_nearby);*/ 
         
        $locations_nearby=array(); 
        $repository = $this->getDoctrine()->getRepository(LocationsGISNearby::class); 
        $gis_nearby = $repository->findBy(array('gis' => $gis[0]->getId()),array('type' => 'ASC')); 
        if(count($gis_nearby) == 0) { 
            $locations = $fossil->getLocationsGIS()->toArray(); 
            $this->forward('App\Controller\LocationsController:find_nearby', [ 
                'item' => $locations[0], 
                'em' => $em, 
                ]); 
            $gis_nearby = $repository->findBy(array('gis' => $gis[0]->getId()),array('type' => 'ASC')); 
        } 
 
        foreach ($gis_nearby as $key => $location) { 
            $repository = $this->getDoctrine()->getRepository(LocationsGIS::class); 
            $filternearby['vulnerability']=$filterby['vulnerability']; 
            $filternearby['approved']=$filterby['approved']; 
            $filternearby['id']=$location->getNearbyGIS()->getId(); 
            $locations_nearby[] = $repository->findOneBy($filternearby); 
        } 
 
        return $this->render('locations_fossil.html.twig', [ 
            'fossil' => $fossil, 
            //'gis' => $gis, 
            'locations_nearby' => $locations_nearby, 
            'type' => 'fossil', 
            'id' => $fossil->getId(), 
            'all_locations' => false, 
            'filterby' => $filterby, 
            'types' => array('fossil'), 
            'country' => null, 
            'fossils_found' => $fossils_found, 
        ]); 
    } 
 
    /** 
     * @Route("/moderate/fossils", name="locations_fossil_moderate") 
     */ 
    public function moderate(Request $request, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $form = $this->createForm(LocationFilterSearchFormType::class); 
        $form->handleRequest($request); 
        if ($form->isSubmitted() && $form->isValid()){ 
            $filter = $form->getData(); 
        } else { 
            $filter=array('property' => array()); 
        } 
        $locations = $this->get_locations_fossil_filtered($filter); 
 
        return $this->render('locations_fossil_moderate.html.twig', [ 
            'items' => $locations, 
            'form' => $form->createView() 
        ]); 
    } 
 
    /** 
     * @Route("/fossil/add", name="locations_fossil_user_add") 
     */ 
    public function user_add(EntityManagerInterface $em, Request $request, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_USER'); 
        if($_ENV['DISABLE_FORMS'] == "true") { return $this->render('maintenance_form_disabled.html.twig'); } 
 
        $repository = $this->getDoctrine()->getRepository(Countries::class); 
        $countries = $repository->findAll(); 
 
        $form = $this->createForm(LocationsUserFossilFormType::class); 
         
        $form->handleRequest($request); 
        if ($form->isSubmitted() && $form->isValid()){ 
            $form_data = $form->getData(); 
 
            $fossil = new LocationsFossil(); 
            $fossil->setNameNl($form_data["name_nl"]); 
            $fossil->setNameEn($form_data["name_en"]); 
            $fossil->setDescriptionEn($form_data["description_en"]); 
            $fossil->getLocation($form_data["location"]); 
            $fossil->setDescriptionNl($form_data["description_nl"]); 
            $fossil->setDescriptionEn($form_data["description_en"]); 
            $fossil->setLocation($form_data["location"]); 
            $fossil->setCountry($form_data["country"]); 
            $fossil->setClosed($form_data["closed"]); 
 
            $fossil->setIsQuaternary($form_data["is_quaternary"]); 
            $fossil->setIsNeogene($form_data["is_neogene"]); 
            $fossil->setIsPaleogene($form_data["is_paleogene"]); 
            $fossil->setIsCretaceous($form_data["is_cretaceous"]); 
            $fossil->setIsJurassic($form_data["is_jurassic"]); 
            $fossil->setIsTriassic($form_data["is_triassic"]); 
            $fossil->setIsPermian($form_data["is_permian"]); 
            $fossil->setIsCarboniferous($form_data["is_carboniferous"]); 
            $fossil->setIsDevonian($form_data["is_devonian"]); 
            $fossil->setIsSilurian($form_data["is_silurian"]); 
            $fossil->setIsOrdovician($form_data["is_ordovician"]); 
            $fossil->setIsCambrian($form_data["is_cambrian"]); 
            $fossil->setIsPrecambrian($form_data["is_precambrian"]); 
 
            $fossil->setHasDinosauria($form_data["has_dinosauria"]); 
            $fossil->setHasChlorophyta($form_data["has_chlorophyta"]); 
            $fossil->setHasBelemnoidea($form_data["has_belemnoidea"]); 
            $fossil->setHasBivalvia($form_data["has_bivalvia"]); 
            $fossil->setHasBrachiopoda($form_data["has_brachiopoda"]); 
            $fossil->setHasBryozoa($form_data["has_bryozoa"]); 
            $fossil->setHasAmmonitida($form_data["has_ammonitida"]); 
            $fossil->setHasNautiloidea($form_data["has_nautiloidea"]); 
            $fossil->setHasCrinoidea($form_data["has_crinoidea"]); 
            $fossil->setHasForaminifera($form_data["has_foraminifera"]); 
            $fossil->setHasGastropoda($form_data["has_gastropoda"]); 
            $fossil->setHasHemichordata($form_data["has_hemichordata"]); 
            $fossil->setHasHexapoda($form_data["has_hexapoda"]); 
            $fossil->setHasAnthozoa($form_data["has_anthozoa"]); 
            $fossil->setHasCrustacea($form_data["has_crustacea"]); 
            $fossil->setHasMammaliaterrestrium($form_data["has_mammaliaterrestrium"]); 
            $fossil->setHasOstracoda($form_data["has_ostracoda"]); 
            $fossil->setHasAngiospermae($form_data["has_angiospermae"]); 
            $fossil->setHasConiferophyta($form_data["has_coniferophyta"]); 
            $fossil->setHasCycadophyta($form_data["has_cycadophyta"]); 
            $fossil->setHasLycophyta($form_data["has_lycophyta"]); 
            $fossil->setHasPteridophyta($form_data["has_pteridophyta"]); 
            $fossil->setHasPteridospermophyta($form_data["has_pteridospermophyta"]); 
            $fossil->setHasSphenophyta($form_data["has_sphenophyta"]); 
            $fossil->setHasRudista($form_data["has_rudista"]); 
            $fossil->setHasPolychaeta($form_data["has_polychaeta"]); 
            $fossil->setHasPorifera($form_data["has_porifera"]); 
            $fossil->setHasIchnofossilia($form_data["has_ichnofossilia"]); 
            $fossil->setHasTrilobita($form_data["has_trilobita"]); 
            $fossil->setHasElasmobranchii($form_data["has_elasmobranchii"]); 
            $fossil->setHasBatoidea($form_data["has_batoidea"]); 
            $fossil->setHasAves($form_data["has_aves"]); 
            $fossil->setHasEchinoidea($form_data["has_echinoidea"]); 
            $fossil->setHasMammaliamarinis($form_data["has_mammaliamarinis"]); 
            $fossil->setHasBacteria($form_data["has_bacteria"]); 
            $fossil->setHasArchaebacteria($form_data["has_archaebacteria"]); 
            $fossil->setHasPhaeophyceae($form_data["has_phaeophyceae"]); 
            $fossil->setHasDiatomophyceae($form_data["has_diatomophyceae"]); 
            $fossil->setHasRadiolaria($form_data["has_radiolaria"]); 
            $fossil->setHasChoanoflagellata($form_data["has_choanoflagellata"]); 
            $fossil->setHasMedusozoa($form_data["has_medusozoa"]); 
            $fossil->setHasAsterozoa($form_data["has_asterozoa"]); 
            $fossil->setHasBlastoidea($form_data["has_blastoidea"]); 
            $fossil->setHasCystoidea($form_data["has_cystoidea"]); 
            $fossil->setHasAgnatha($form_data["has_agnatha"]); 
            $fossil->setHasPlacodermi($form_data["has_placodermi"]); 
            $fossil->setHasChimaeriformes($form_data["has_chimaeriformes"]); 
            $fossil->setHasActinopterygii($form_data["has_actinopterygii"]); 
            $fossil->setHasSarcopterygii($form_data["has_sarcopterygii"]); 
            $fossil->setHasDipnoi($form_data["has_dipnoi"]); 
            $fossil->setHasAmphibia($form_data["has_amphibia"]); 
            $fossil->setHasAnapsida($form_data["has_anapsida"]); 
            $fossil->setHasSquamata($form_data["has_squamata"]); 
            $fossil->setHasSauropterygia($form_data["has_sauropterygia"]); 
            $fossil->setHasIchthyosauria($form_data["has_ichthyosauria"]); 
            $fossil->setHasCrocodylomorpha($form_data["has_crocodylomorpha"]); 
            $fossil->setHasPterosauria($form_data["has_pterosauria"]); 
            $fossil->setHasPlatyzoa($form_data["has_platyzoa"]); 
            $fossil->setHasAnnelida($form_data["has_annelida"]); 
            $fossil->setHasPolyplacophora($form_data["has_polyplacophora"]); 
            $fossil->setHasScaphopoda($form_data["has_scaphopoda"]); 
            $fossil->setHasNautilida($form_data["has_nautilida"]); 
            $fossil->setHasGoniatitida($form_data["has_goniatitida"]); 
            $fossil->setHasCeratitida($form_data["has_ceratitida"]); 
            $fossil->setHasNeocoleoidea($form_data["has_neocoleoidea"]); 
            $fossil->setHasArachnida($form_data["has_arachnida"]); 
            $fossil->setHasMerostomata($form_data["has_merostomata"]); 
            $fossil->setHasMyriapoda($form_data["has_myriapoda"]); 
            $fossil->setHasFungi($form_data["has_fungi"]); 
            $fossil->setHasMycetozoa($form_data["has_mycetozoa"]); 
            $fossil->setHasGinkgophyta($form_data["has_ginkgophyta"]); 
            $fossil->setHasBryophyta($form_data["has_bryophyta"]); 
            $fossil->setHasIncertaesedis($form_data["has_incertaesedis"]); 
 
            $fossil->setVulnerability($form_data["vulnerability"]); 
            $fossil->setUserId($this->getUser()->getId()); 
            $fossil->setUsername($this->getUser()->getUsername()); 
            $fossil->setDateAdded(new \DateTime()); 
            $fossil->setApproved(0); 
            $fossil->setNumReviews(0); 
            $fossil->setNumNewPhotos(0); 
            $em->persist($fossil); 
            $em->flush(); 
 
            $gis = new LocationsGIS(); 
            $gis->setNameNl($fossil->getLocation()); 
            $gis->setNameEn($fossil->getLocation()); 
            $gis->setShape($form_data["shape"]); 
            $gis->setData($form_data["data"]); 
            $gis->setRadius($form_data["radius"]); 
            $gis->setCenterLat($form_data["center_lat"]); 
            $gis->setCenterLng($form_data["center_lng"]); 
            $gis->setVulnerability($form_data["vulnerability"]); 
            $gis->setCountry($fossil->getCountry()); 
            $gis->setUserId($this->getUser()->getId()); 
            $gis->setUsername($this->getUser()->getUsername()); 
            $gis->setApproved('0'); 
            $gis->setType('fossil'); 
            $gis->setFossil($fossil); 
            $em->persist($gis); 
            $em->flush(); 
 
            $this->addFlash('success', $translator->trans("Fossielenlocatie toegevoegd aan de wachtlijst voor goedkeuring.")); 
            return $this->redirectToRoute('locations_user_add'); 
        } 
 
        return $this->render('locations_add_location_fossil.html.twig', [ 
            'title' => $translator->trans("Fossielenlocatie toevoegen"), 
            'form' => $form->createView(), 
            'gis' => array(), 
            'countries' => $countries, 
            'type' => 'user_fossil', 
            'form_name' => 'locations_user_fossil', 
            'show_map' => true 
        ]); 
    } 
 
    /** 
     * @Route("/moderate/fossil/add", name="locations_fossil_moderate_add") 
     */ 
    public function add( EntityManagerInterface $em, Request $request, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $form = $this->createForm(LocationsFossilFormType::class); 
 
        $form->handleRequest($request); 
        if ($form->isSubmitted() && $form->isValid()){ 
            $fossil = $form->getData(); 
            $fossil->setUserId($this->getUser()->getId()); 
            $fossil->setUsername($this->getUser()->getUsername()); 
            $fossil->setDateAdded(new \DateTime()); 
            $fossil->setApproved(0); 
            $fossil->setNumReviews(0); 
            $fossil->setNumNewPhotos(0); 
            $em->persist($fossil); 
            $em->flush(); 
            $this->addFlash('success', $translator->trans("Fossielenlocatie toegevoegd")); 
            return $this->redirectToRoute('locations_gis_item_moderate',  array('type' => 'fossil', 'id' => $fossil->getId())); 
        } 
 
        return $this->render('locations_add_location_fossil.html.twig', [ 
            'title' => $translator->trans("Fossielenlocatie toevoegen"), 
            'form' => $form->createView(), 
            'gis' => array(), 
            'countries' => array(), 
            'type' => 'fossil', 
            'form_name' => 'location_fossil', 
            'button_text' => $translator->trans("Toevoegen") 
        ]); 
    } 
 
    /** 
     * @Route("/moderate/fossil/{id}/edit", name="locations_fossil_moderate_edit") 
     */ 
    public function edit(int $id, LocationsFossil $fossil, EntityManagerInterface $em, Request $request, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $fossil = $this->get_locations_fossil_by_id($id); 
        $old_vulnerability = $fossil->getVulnerability(); 
 
        $form = $this->createForm(LocationsFossilFormType::class, $fossil); 
 
        $form->handleRequest($request); 
        if ($form->isSubmitted() && $form->isValid()) { 
            $fossil = $form->getData(); 
 
            $fossil->setDateReviewed(new \DateTime()); 
            $em->persist($fossil); 
            $em->flush(); 
 
            $spool = new Spool(); 
            $spool->setCommand("geojson:locations"); 
            $spool->setArguments(serialize(array('vulnerability' => $fossil->getVulnerability(), 'type' => 'fossil'))); 
            $em->persist($spool); 
            $em->flush(); 
 
            if($fossil->getVulnerability() != $old_vulnerability) { 
                $vulnerability = ''; 
                $spool = new Spool(); 
                $spool->setCommand("geojson:locations"); 
                $spool->setArguments(serialize(array('vulnerability' => $old_vulnerability, 'type' => 'fossil'))); 
                $em->persist($spool); 
                $em->flush(); 
            } 
 
            if ($fossil->getApproved() == 1){ 
                $fossil->setApprovedUserId($this->getUser()->getId()); 
                $fossil->setApprovedUsername($this->getUser()->getUsername()); 
                $newsfeed = new Newsfeed(); 
                $newsfeed->setTitleNl($fossil->getLocation()); 
                $newsfeed->setTitleEn($fossil->getLocation()); 
                $newsfeed->setRemoteId($fossil->getId()); 
                $newsfeed->setType('locations_fossil'); 
                $newsfeed->setIsUpdate(1); 
                $newsfeed->setTime(new \DateTime()); 
                $em = $this->getDoctrine()->getManager(); 
                $em->persist($newsfeed); 
                $em->flush(); 
 
                $repository = $em->getRepository(SearchItems::class); 
                $searchitem = $repository->findOneBy(array('path' => $this->router->generate('locations_fossil', [ 'id' => $fossil->getId()]) )); 
 
                if(!$searchitem) { 
                    $searchitem = new SearchItems(); 
                } 
     
                $searchitem->setType('locations_fossil'); 
                $searchitem->setPath($this->router->generate('locations_fossil', [ 'id' => $fossil->getId()])); 
                $searchitem->setNameNl($fossil->getNameNl()); 
                $searchitem->setNameEn($fossil->getNameEn()); 
                $searchitem->setKeywordsNl($fossil->getNameNl()); 
                $searchitem->setKeywordsEn($fossil->getNameEn()); 
                if(empty($fossil->getDateReviewed())) { 
                    $searchitem->setLastUpdateTime($fossil->getDateAdded()); 
                } else { 
                    $searchitem->setLastUpdateTime($fossil->getDateReviewed()); 
                } 
                $this->em->persist($searchitem); 
 
                $repository = $em->getRepository(LocationsFossil::class); 
                $totalsubmissions = $repository->createQueryBuilder('a') 
                    ->select('count(a.id)') 
                    ->andWhere("a.user_id = (:user)") 
                    ->andWhere("a.approved = 1") 
                    ->setParameter('user', $fossil->getUserId()) 
                    ->getQuery() 
                    ->getSingleScalarResult(); 
         
                $repository = $em->getRepository(User::class); 
                $user = $repository->findOneBy(array('id' => $fossil->getUserId())); 
         
                $repository = $this->getDoctrine()->getRepository(UserProfile::class); 
                $userprofile = $repository->findOneBy(array('user' => $user)); 
                if(!$userprofile) { 
                    $userprofile = new UserProfile(); 
                    $userprofile->setUser($user); 
                } 
                $userprofile->setLocationFossilSubmissions($totalsubmissions); 
                $em->persist($userprofile); 
                $em->flush(); 
            } 
            $this->addFlash('success', $translator->trans("Fossielenlocatie bijgewerkt")); 
            return $this->redirectToRoute('locations_fossil_moderate'); 
        } 
 
        return $this->render('locations_add_location_fossil.html.twig', [ 
            'title' => $translator->trans("Fossielenlocatie bewerken"), 
            'form' => $form->createView(), 
            'gis' => array(), 
            'countries' => array(), 
            'type' => 'fossil', 
            'form_name' => 'locations_fossil', 
            'button_text' => $translator->trans("Bewerken") 
        ]); 
    } 
 
    /** 
     * @Route("/moderate/fossil/{id}/revoke", name="locations_fossil_moderate_revoke") 
     */ 
    public function moderate_revoke(int $id, LocationsFossil $fossil, EntityManagerInterface $em, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $fossil->setApprovedUserId($this->getUser()->getId()); 
        $fossil->setApprovedUsername($this->getUser()->getUsername()); 
        $fossil->setApproved('0'); 
        $em->persist($fossil); 
        $em->flush(); 
 
        $repository = $this->getDoctrine()->getRepository(LocationsGIS::class); 
        $gis = $repository->findBy(array('fossil' => $fossil)); 
        foreach ($gis as $key => $location) { 
            $this->forward('App\Controller\LocationsController:remove_nearby', [ 
                'item' => $location, 
                'em' => $em, 
                ]); 
                 
            $location->setApproved('0'); 
            $em->persist($location); 
            $em->flush(); 
        } 
 
        $spool = new Spool(); 
        $spool->setCommand("geojson:locations"); 
        $spool->setArguments(serialize(array('vulnerability' => $fossil->getVulnerability(), 'type' => 'fossil'))); 
        $em->persist($spool); 
        $em->flush(); 
 
        $repository = $em->getRepository(SearchItems::class); 
        $searchitem = $repository->findOneBy(array('path' => $this->router->generate('locations_fossil', [ 'id' => $fossil->getId()]) )); 
        if($searchitem){ 
            $em->remove($searchitem); 
            $em->flush(); 
        } 
 
        $repository = $em->getRepository(LocationsFossil::class); 
        $totalsubmissions = $repository->createQueryBuilder('a') 
            ->select('count(a.id)') 
            ->andWhere("a.user_id = (:user)") 
            ->andWhere("a.approved = 1") 
            ->setParameter('user', $fossil->getUserId()) 
            ->getQuery() 
            ->getSingleScalarResult(); 
 
        $repository = $em->getRepository(User::class); 
        $user = $repository->findOneBy(array('id' => $fossil->getUserId())); 
 
        $repository = $this->getDoctrine()->getRepository(UserProfile::class); 
        $userprofile = $repository->findOneBy(array('user' => $user)); 
        if(!$userprofile) { 
            $userprofile = new UserProfile(); 
            $userprofile->setUser($user); 
        } 
        $userprofile->setLocationFossilSubmissions($totalsubmissions); 
        $em->persist($userprofile); 
        $em->flush(); 
 
        $this->addFlash('success', $translator->trans("Fossielenlocatie ingetrokken")); 
        return $this->redirectToRoute('locations_fossil_moderate'); 
    } 
 
    /** 
     * @Route("/moderate/fossil/{id}/approve", name="locations_fossil_moderate_approve") 
     */ 
    public function moderate_approve(int $id, LocationsFossil $fossil, EntityManagerInterface $em, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $LocationsGIS = $fossil->getLocationsGIS()->toArray(); 
        $has_approved_locations=0; 
        foreach ($LocationsGIS as $key => $item) { 
            if($item->getApproved() == true ){ 
                $has_approved_locations++; 
            } 
        } 
        if (count($fossil->getLocationsGIS()) <= 0) { 
            $this->addFlash('error', $translator->trans("Locatie heeft geen coördinaten en kan daarom niet goedgekeurd worden")); 
            return $this->redirectToRoute('locations_fossil_moderate'); 
        } elseif ($has_approved_locations <= 0) { 
            $this->addFlash('error', $translator->trans("Locatie heeft geen goedgekeurde coördinaten en kan daarom niet goedgekeurd worden")); 
            return $this->redirectToRoute('locations_fossil_moderate'); 
        } else { 
            $fossil->setApprovedUserId($this->getUser()->getId()); 
            $fossil->setApprovedUsername($this->getUser()->getUsername()); 
            $fossil->setApproved('1'); 
            $em->persist($fossil); 
            $em->flush(); 
 
            $spool = new Spool(); 
            $spool->setCommand("geojson:locations"); 
            $spool->setArguments(serialize(array('vulnerability' => $fossil->getVulnerability(), 'type' => 'fossil'))); 
            $em->persist($spool); 
            $em->flush(); 
             
            $newsfeed = new Newsfeed(); 
            $newsfeed->setTitleNl($fossil->getLocation()); 
            $newsfeed->setTitleEn($fossil->getLocation()); 
            $newsfeed->setRemoteId($fossil->getId()); 
            $newsfeed->setType('locations_fossil'); 
            $newsfeed->setTime(new \DateTime()); 
            $newsfeed->setIsUpdate(0); 
            $em = $this->getDoctrine()->getManager(); 
            $em->persist($newsfeed); 
            $em->flush(); 
 
            $repository = $em->getRepository(SearchItems::class); 
            $searchitem = $repository->findOneBy(array('path' => $this->router->generate('locations_fossil', [ 'id' => $fossil->getId()]) )); 
 
            if(!$searchitem) { 
                $searchitem = new SearchItems(); 
            } 
 
            $searchitem->setType('locations_fossil'); 
            $searchitem->setPath($this->router->generate('locations_fossil', [ 'id' => $fossil->getId()])); 
            $searchitem->setNameNl($fossil->getNameNl()); 
            $searchitem->setNameEn($fossil->getNameEn()); 
            $searchitem->setKeywordsNl($fossil->getNameNl()); 
            $searchitem->setKeywordsEn($fossil->getNameEn()); 
            if(empty($fossil->getDateReviewed())) { 
                $searchitem->setLastUpdateTime($fossil->getDateAdded()); 
            } else { 
                $searchitem->setLastUpdateTime($fossil->getDateReviewed()); 
            } 
            $this->em->persist($searchitem); 
 
            $repository = $em->getRepository(LocationsFossil::class); 
            $totalsubmissions = $repository->createQueryBuilder('a') 
                ->select('count(a.id)') 
                ->andWhere("a.user_id = (:user)") 
                ->andWhere("a.approved = 1") 
                ->setParameter('user', $fossil->getUserId()) 
                ->getQuery() 
                ->getSingleScalarResult(); 
     
            $repository = $em->getRepository(User::class); 
            $user = $repository->findOneBy(array('id' => $fossil->getUserId())); 
     
            $repository = $this->getDoctrine()->getRepository(UserProfile::class); 
            $userprofile = $repository->findOneBy(array('user' => $user)); 
            if(!$userprofile) { 
                $userprofile = new UserProfile(); 
                $userprofile->setUser($user); 
            } 
            $userprofile->setLocationFossilSubmissions($totalsubmissions); 
            $em->persist($userprofile); 
            $em->flush(); 
 
            $locations = $fossil->getLocationsGIS()->toArray(); 
            $this->forward('App\Controller\LocationsController:find_nearby', [ 
                'item' => $locations[0], 
                'em' => $em, 
                ]); 
             
            $this->addFlash('success', $translator->trans("Fossielenlocatie goedgekeurd")); 
            return $this->redirectToRoute('locations_fossil_moderate'); 
        } 
    } 
 
    /** 
     * @Route("/moderate/fossil/{id}/delete", name="locations_fossil_moderate_delete") 
     */ 
    public function moderate_delete(int $id, LocationsFossil $fossil, EntityManagerInterface $em, TranslatorInterface $translator) 
    { 
        $this->denyAccessUnlessGranted('ROLE_MOD_LOCATIONS'); 
 
        $old_vulnerability = $fossil->getVulnerability(); 
 
        $repository = $em->getRepository(SearchItems::class); 
        $searchitem = $repository->findOneBy(array('path' => $this->router->generate('locations_fossil', [ 'id' => $fossil->getId()]) )); 
        if($searchitem){ 
            $em->remove($searchitem); 
            $em->flush(); 
        } 
 
        $repository = $this->getDoctrine()->getRepository(LocationsGIS::class); 
        $gis = $repository->findBy(array('fossil' => $fossil)); 
        foreach ($gis as $key => $location) { 
            $this->forward('App\Controller\LocationsController:remove_nearby', [ 
                'item' => $location, 
                'em' => $em, 
                ]); 
                 
            $em->remove($location); 
            $em->flush(); 
        } 
        $em->remove($fossil); 
        $em->flush(); 
 
        $spool = new Spool(); 
        $spool->setCommand("geojson:locations"); 
        $spool->setArguments(serialize(array('vulnerability' => $old_vulnerability, 'type' => 'fossil'))); 
        $em->persist($spool); 
        $em->flush(); 
 
        $repository = $em->getRepository(LocationsFossil::class); 
        $totalsubmissions = $repository->createQueryBuilder('a') 
            ->select('count(a.id)') 
            ->andWhere("a.user_id = (:user)") 
            ->andWhere("a.approved = 1") 
            ->setParameter('user', $fossil->getUserId()) 
            ->getQuery() 
            ->getSingleScalarResult(); 
 
        $repository = $em->getRepository(User::class); 
        $user = $repository->findOneBy(array('id' => $fossil->getUserId())); 
 
        $repository = $this->getDoctrine()->getRepository(UserProfile::class); 
        $userprofile = $repository->findOneBy(array('user' => $user)); 
        if(!$userprofile) { 
            $userprofile = new UserProfile(); 
            $userprofile->setUser($user); 
        } 
        $userprofile->setLocationFossilSubmissions($totalsubmissions); 
        $em->persist($userprofile); 
        $em->flush(); 
 
        $this->addFlash('success', $translator->trans("Fossielenlocatie en coördinaten verwijderd")); 
        return $this->redirectToRoute('locations_fossil_moderate'); 
    } 
 
    /** 
     * @Route("/api/v1/locations/fossil", methods="GET", name="api_locations_fossil") 
     */ 
    public function api_locations_fossil(LocationsFossilRepository $LocationsFossilRepository, Request $request, TranslatorInterface $translator) 
    { 
        $articles = $LocationsFossilRepository->findAllMatching($request->query->get('query')); 
        $return = array(); 
        foreach($articles as $item) { 
            if($translator->getLocale() == 'nl') { 
                $name = $item->getNameNl(); 
            } else { 
                $name = $item->getNameEn(); 
            } 
            $return[] = array( 
                'id' => $item->getId(), 
                'value' => $name, 
            ); 
        } 
        return $this->json($return, 200, [], ['groups' => ['main']]); 
    } 
}