<?php

namespace OfficeBrain\Bundle\RequestQuoteBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Validator\ExecutionContextInterface as context;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormError;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\EntityRepository;

class RequestQuoteAddGuestShippingType extends AbstractType
{
   /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
	
	protected $coreManager;
    
    public function __construct($coreManager,$addEditFlag='',$formData=array())
    {
    	$this->coreManager = $coreManager; 
    	$this->flag = $addEditFlag;
    	$this->formData = $formData;    	
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    	$master = $this->coreManager;
    	$country=$master->getCountryData();
    	if($this->flag == 'edit'){
    		$countryIdData = $this->formData['countryId'];
    		$stateIdData = $this->formData['stateId'];
    		$cityIdData = $this->formData['cityId'];
    		$addressType = $this->formData['adressType'];
    		
    	}else{
    		$countryIdData = $builder->getData()['countryId'];
    		$stateIdData = $builder->getData()['stateId'];    		
    		$cityIdData = $builder->getData()['cityId'];
    		$addressType = '';
    	}
    	 
    	if ($countryIdData != "") {
    		$state = $master->getStateData($countryIdData);
    	} else {
    		$state = array();
    	}
    	if ($stateIdData != "") {
    		$city = $master->getCityData($stateIdData, $countryIdData);
    	} else {
    		$city = array();
    	}
       
       $builder->add('name', 'text', array(
       		'required' => false,
       		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.companyName.not_blank'))),
       ))
       
       ->add('adressType', 'entity', array(
       		'class' => 'OfficeBrainCoreBundle:AddressType',
       		'query_builder' => function (EntityRepository $er) {
       			return $er->createQueryBuilder('a')
       			->orderBy('a.id', 'ASC');
       		},
       		'property' => 'name',
       		'placeholder' => 'Select Address Type',
       		'empty_data'  => null,
       		'data'  => $addressType,
       		
       ))
       
       ->add('email', 'text', array(
       		'required' => false,
       		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.email.not_blank')),
       							   new Assert\Regex(array('pattern' => '/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-z]{2,4}$/','message'=>'user.contact_book.email.not_valid'))),
       ))
       
       ->add('address1', 'text',array(
       			'required' => false,
       			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.street1.not_blank'))),
       	))
      
       	->add('address2', 'text',array(
       			'required' => false,
       			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.street2.not_blank'))),
       	))
       
       	->add('countryId', 'choice', array(
       			'choices'=> $country,
       			'empty_value'=>  'user.contact_book.countryId.select_value',
       			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.countryId.not_blank'))),
       			'data'=>$countryIdData,
       	))
       	->add('stateId', 'choice', array(
       			'choices'=> $state,
       			'placeholder' => 'user.contact_book.stateId.select_value',
       			'empty_data'  => null,
       			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.stateId.not_blank'))),
       			'data'=>$stateIdData,
       	))
       	->add('cityId', 'choice', array(
       			'choices'=> $city,
       			'placeholder' => 'user.contact_book.cityId.select_value',
       			'empty_data'  => null,
       			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.cityId.not_blank'))),
       			'data'=>$cityIdData,
       	))
       	
       	->add('zipcode', 'text')
       	->add('extension', 'text')
       	->add('phone', 'text')
       	->add('fax', 'text')
       	->add('mobile', 'text')
       	->add('mobile', 'text')
       	->add('address_type','hidden',array('data'=>2))
       	->add('website', 'text',array(
       			'required' => false,
       			'constraints' => array(
       					new Assert\Regex(array('pattern'=>'/^(https?:\/\/|http?:\/\/|HTTPS?:\/\/|HTTP?:\/\/)?([\da-zA-Z\.-]+)\.([a-zA-Z\.]{2,6})([\/\w \.-]*)*\/?$/', 'message'=>'user.contact_book.website.not_valid')))
       	))
//        	->add('isOffice', 'choice', array(
//        			'choices' => $shippingType,
//        			'multiple'=>false,
//        			'expanded' => true,
//        	))
       	
       ;
       
        
       
       $formModifier1 = function (FormInterface $form, $state,$stateIdData='') {
       	$form->add('stateId', 'choice', array(
       			'placeholder' => 'user.contact_book.stateId.select_value',
       			'empty_data'  => null,
       			'choices' => $state,
       			'data' => $stateIdData,
       	));
       };
       
       $formModifier2 = function (FormInterface $form, $city,$cityIdData) {
       	$form->add('cityId', 'choice', array(
       			'placeholder' => 'user.contact_book.cityId.select_value',
       			'empty_data'  => null,
       			'choices' => $city,
       			'data' => $cityIdData,
       	));
       };
       
       $builder->addEventListener(
       		FormEvents::PRE_SET_DATA,
       		function (FormEvent $event) use ($formModifier1, $formModifier2, $master,$countryIdData,$stateIdData,$cityIdData) {
       			// this would be your entity, i.e. SportMeetup
       			$data = $event->getData();
       			if($this->flag == 'edit'){
       				$country  = $countryIdData;
       				$state1 = $stateIdData;       				
       			}else{
       				$country = $data['countryId']? $data['countryId']:'';
       				$state1 = $data['stateId']? $data['stateId']:'';       				
       			}       			 
       			$state=$master->getStateData($country);       			
       			$formModifier1($event->getForm(), $state,$stateIdData);
       			$city=$master->getCityData($state1, $country);
       			$formModifier2($event->getForm(), $city,$cityIdData);
       		}
       );
       
       
       $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier1, $formModifier2, $master,$countryIdData,$stateIdData,$cityIdData) {
       	$contactBook = $event->getData();
       	$form = $event->getForm();
       
       	if ($form->has('countryId')) {
       		
       		$stateDataArray=$master->getStateData($contactBook['countryId']);
       		$formModifier1($form, $stateDataArray,$stateIdData);
       	}
       	if ($form->has('stateId')) {
       		$cityDataArray=$master->getCityData($contactBook['stateId']);
       		$formModifier2($form, $cityDataArray,$cityIdData);
       	}
       
       });
    }
    
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
         $resolver->setDefaults(array(
            'data_class' => null
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
		return 'shipping';
    }
}
