<?php

namespace OfficeBrain\Bundle\OrderBundle\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 OrderAddGuestShippingType extends AbstractType
{
   /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
   
   protected $coreManager;
    
    public function __construct($coreManager,$addEditFlag='',$formData=array())
    {
      $this->coreManager = $coreManager; 
      $this->flag = $addEditFlag;
      $this->addTypes = '';
      if(is_array($formData)){
         if(array_key_exists('adressType', $formData)){
            $addTypes = $formData['adressType'];
         }
         $this->formData = $formData; 
      }else{
         $this->formData = array();
         if($formData=="shipping"){$addTypes=2;}
         if($formData=="billing"){$addTypes=1;}
      }
      $this->addTypes = $addTypes;        
    }
    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 = 233; //$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'=>'Enter first and last name'))),
       ));
       if($this->addTypes!=''){
         $builder->add('adressType', 'entity', array(
                    'class' => 'OfficeBrainCoreBundle:AddressType',
                    'query_builder' => function (EntityRepository $er) {
                        return $er->createQueryBuilder('a')
                  ->andWhere('a.id ='.$this->addTypes)
                        ->orderBy('a.id', 'ASC');
                    },
                    'property' => 'name',
                    
                    
            )) ;  
         }else{
            $builder->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,
            )) ; 
         }
       
       $builder ->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'=>'Please enter address'))),
         ))
      
         ->add('address2', 'text',array(
               'required' => false
         ))
       
         ->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('cityId', 'text', array(
               'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.cityId.not_blank')))
         ))
         
         ->add('zipcode', 'text',array(
               'constraints' => array(new Assert\NotBlank(array('message'=>'Please enter zip')))
         ))

         ->add('extension', 'text')
         ->add('phone', 'text',array(
               'constraints' => array(new Assert\NotBlank(array('message'=>'Please enter phone')))
         ))
         ->add('fax', '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,
               'constraints' => array(new Assert\NotBlank(array('message'=>'user.contact_book.stateId.not_blank'))),
               '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) {
            function (FormEvent $event) use ($formModifier1, $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) {

      $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($formModifier1, $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';
    }
}
