<?php

namespace OfficeBrain\Bundle\QuoteBundle\Form;


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



class AddCustomerType extends AbstractType
{
	protected $coreManager;
    
    public function __construct($coreManager,$addEditFlag='')
    {
    	$this->coreManager = $coreManager; 
    	$this->flag = $addEditFlag;
    }
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    	$master = $this->coreManager;        
        $country=$master->getCountryData();        
        if($this->flag == 'edit'){
        	$countryIdData = $builder->getData()->getCountryId();
        	$stateIdData = $builder->getData()->getStateId();
        }else{
        	$countryIdData = $builder->getData()['countryId'];
        	$stateIdData = $builder->getData()['stateId'];        	
        }
        
        if ($countryIdData != "") {
            $state = $master->getStateData($countryIdData);
        } else {
            $state = array();
        }
        if ($stateIdData != "") {
            $city = $master->getCityData($stateIdData, $countryIdData);
        } else {
            $city = array();
        }

        
        $builder->add('companyName', 'text', array(
                	    'required' => false,
        				'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.companyName.not_blank'))),
            		))
        		->add('firstName', 'text', array(
                    'required' => false,
            		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.name.not_blank')),
            								new Assert\Regex(array("pattern"=>"/^[A-Za-z_\-'\s]+$/", "match"=>true, "message"=>"user.contact_book.name.not_valid"))),           		 
            		 
            	))
            	->add('lastName', 'text', array(
            			'required' => false,
            	))
            	->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-zA-Z0-9-.]+$/', 'message'=>'user.contact_book.name.not_valid')))            				
            	))
            	->add('address', 'text',array(
		                 'required' => false,
        				 'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.street1.not_blank'))),
        		  ))
        		->add('street2', 'text')
            	->add('countryId', 'choice', array(
                    'choices'=> $country,
            		'empty_value'=>  'admin.quote_info.quote_country_placeholder',
            		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.countryId.not_blank'))),
            	))
            	->add('countryName', 'text', array(
            			'required' => false,
            			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.countryName.not_blank'))),
            	))
            	->add('stateId', 'choice', array(
                    'choices'=> $state,
                    'empty_value'=>  'admin.quote_info.quote_state_placeholder',
            		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.stateId.not_blank'))),
            	))
            	->add('stateName', 'text', array(
            			'required' => false,
            			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.stateName.not_blank'))),
            	))
            	->add('cityId', 'choice', array(
                    'choices'=> $city,
                    'empty_value'=>  'admin.quote_info.quote_city_placeholder',
            	))
            	->add('cityName', 'text', array(
            			'required' => false,
            			'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.cityName.not_blank'))),
            	))
            	->add('zipcode', 'text')
            	->add('phone', 'text', array(
                    'required' => false,
            		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.contact_number.not_blank')),
            								new Assert\Regex(array('pattern'=>'/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', 'message'=>'user.phone.invalid'))),           		 
            	))
            	->add('fax', 'text')
            	->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('photo', 'file', array('required' => false, 'data_class' => null, 'constraints'=>array(
            			new Assert\File(array('maxSize' => '250M', 'mimeTypes' => array('image/png', 'image/jpeg', 'image/pjpeg', 'image/gif'),
            					'mimeTypesMessage' => 'contact.upload_client_logo.mime_messg',
            					'maxSizeMessage' => 'contact.upload_client_logo.file_max_messg'))
            	)))
            	;
            	 
            	

        $formModifier1 = function (FormInterface $form, $state) {
                    $form->add('stateId', 'choice', array(
                            'choices' => $state,
                    		'empty_value'=>  'admin.quote_info.quote_state_placeholder',
                    		'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.stateId.not_blank'))),
                    ));
                };

        $formModifier2 = function (FormInterface $form, $city) {
                    $form->add('cityId', 'choice', array(
                            'empty_value'=>  'admin.quote_info.quote_city_placeholder',
                            'choices' => $city,
                    ));
                };

        $builder->addEventListener(
                        FormEvents::PRE_SET_DATA,
                        function (FormEvent $event) use ($formModifier1, $formModifier2, $master) {
                            // this would be your entity, i.e. SportMeetup
                            $data = $event->getData();
                            if($this->flag == 'edit'){
                            	$country = $data->getCountryId()? $data->getCountryId():'';
                            	$state1 = $data->getStateId()? $data->getStateId():'';
                            }else{
                            	$country = $data['countryId']? $data['countryId']:'';
                            	$state1 = $data['stateId']? $data['stateId']:'';
                            }                            
                            $state=$master->getStateData($country);
                            $formModifier1($event->getForm(), $state);
                            $city=$master->getCityData($state1, $country);
                            $formModifier2($event->getForm(), $city);
                        }
                );


        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier1, $formModifier2, $master) {
                    $contactBook = $event->getData();
                    $form = $event->getForm();
                    
                    if ($form->has('countryId')) {
                        $stateDataArray=$master->getStateData($contactBook['countryId']);
                        $formModifier1($form, $stateDataArray);
                    }
                    if ($form->has('stateId')) {
                        $cityDataArray=$master->getCityData($contactBook['stateId']);
                        $formModifier2($form, $cityDataArray);
                    }

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