*
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see .
 */
namespace Chill\EventBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Chill\MainBundle\DataFixtures\ORM\LoadPermissionsGroup;
use Chill\MainBundle\Entity\RoleScope;
use Chill\MainBundle\DataFixtures\ORM\LoadScopes;
use Doctrine\Persistence\ObjectManager;
/**
 * Add roles to existing groups
 *
 * @author Julien Fastré 
 * @author Champs Libres 
 */
class LoadRolesACL extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        foreach (LoadPermissionsGroup::$refs as $permissionsGroupRef) {
            $permissionsGroup = $this->getReference($permissionsGroupRef);
            foreach (LoadScopes::$references as $scopeRef){
                $scope = $this->getReference($scopeRef);
                //create permission group
                switch ($permissionsGroup->getName()) {
                    case 'social':
                        if ($scope->getName()['en'] === 'administrative') {
                            break 2; // we do not want any power on administrative
                        }
                        break;
                    case 'administrative':
                    case 'direction':
                        if (in_array($scope->getName()['en'], array('administrative', 'social'))) {
                            break 2; // we do not want any power on social or administrative
                        }  
                        break;
                }
                
                printf("Adding CHILL_EVENT_UPDATE & CHILL_EVENT_CREATE "
                        . "& CHILL_EVENT_PARTICIPATION_UPDATE & CHILL_EVENT_PARTICIPATION_CREATE "
                        . "& CHILL_EVENT_SEE & CHILL_EVENT_SEE_DETAILS "
                        . "to %s "
                        . "permission group, scope '%s' \n", 
                        $permissionsGroup->getName(), $scope->getName()['en']);
                
                $roleScopeUpdate = (new RoleScope())
                            ->setRole('CHILL_EVENT_UPDATE')
                            ->setScope($scope);
                $roleScopeUpdate2 = (new RoleScope())
                            ->setRole('CHILL_EVENT_PARTICIPATION_UPDATE')
                            ->setScope($scope);
                $permissionsGroup->addRoleScope($roleScopeUpdate);
                $permissionsGroup->addRoleScope($roleScopeUpdate2);
                
                $roleScopeCreate = (new RoleScope())
                            ->setRole('CHILL_EVENT_CREATE')
                            ->setScope($scope);
                $roleScopeCreate2 = (new RoleScope())
                            ->setRole('CHILL_EVENT_PARTICIPATION_CREATE')
                            ->setScope($scope);
                $permissionsGroup->addRoleScope($roleScopeCreate);
                $permissionsGroup->addRoleScope($roleScopeCreate2);
    
                $roleScopeSee = (new RoleScope())
                    ->setRole('CHILL_EVENT_SEE')
                    ->setScope($scope);
                $roleScopeSee2 = (new RoleScope())
                    ->setRole('CHILL_EVENT_SEE_DETAILS')
                    ->setScope($scope);
                $permissionsGroup->addRoleScope($roleScopeSee);
                $permissionsGroup->addRoleScope($roleScopeSee2);
                
                $manager->persist($roleScopeUpdate);
                $manager->persist($roleScopeUpdate2);
                $manager->persist($roleScopeCreate);
                $manager->persist($roleScopeCreate2);
                $manager->persist($roleScopeSee);
                $manager->persist($roleScopeSee2);
            }
            
        }
        
        $manager->flush();
    }
    public function getOrder()
    {
        return 30011;
    }
}