<?php

namespace OfficeBrain\Bundle\CmsBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\NotBlank;

class ThirdPartyServiceMetaType extends AbstractType
{
    protected $thirdPartySettingMaster;
    protected $countryArray;
    protected $instanceId;
    protected $userId;
    
    public function __construct($thirdPartySettingMaster, $countryArr, $projectSetting)
    {
        $this->thirdPartySettingMaster = $thirdPartySettingMaster;
        $this->countryArray = $countryArr;
        $this->instanceId = $projectSetting['instance_id'];
        /* $this->instanceType = $this->projectSetting['instance_type'];*/        
        $this->userId = $projectSetting['user_id'];
    }
    
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($this->thirdPartySettingMaster->getThirdPartyServiceKey() as $thirdPartyServiceKey) {
        	
            $thirdPartyServiceMetaArray = $thirdPartyServiceKey->getThirdPartyServiceMeta();
            $thirdPartyServiceMeta = null;
            
            if($thirdPartyServiceMetaArray){
            	foreach($thirdPartyServiceMetaArray as $thirdPartyServiceMetaValue){
            		if($this->userId == $thirdPartyServiceMetaValue->getCreatedUid() && $this->instanceId ==$thirdPartyServiceMetaValue->getInstanceId()){
              			$thirdPartyServiceMeta = $thirdPartyServiceMetaValue;
            			break;
            		}
            	}
            }
            
            $defaultVal = "";
            $multiDefVal = array();
            
            if ($thirdPartyServiceMeta ) {
                $defaultVal = $thirdPartyServiceMeta->getValue();
                $multiDefVal = $thirdPartyServiceMeta->getValue();
            }
            
            $fieldKeyName = str_replace(".", "_", $thirdPartyServiceKey->getKeyName()) . '-'. $thirdPartyServiceKey->getId();
            
            $dataKey = explode('-', $fieldKeyName);
            
            $fieldType = $thirdPartyServiceKey->getKeyType();
            
            $isRequired = $thirdPartyServiceKey->getRequiredField();
            $isRequired = ($isRequired == '1') ? true : false;
            
            $predefinedValue = $thirdPartyServiceKey->getPredefinedValue();
            $groupKey = $thirdPartyServiceKey->getKeyFor();
            
            $builder ->add('countryId', 'choice', array(
                    'label' => 'configuration.form.country_id',
                    'choices' => $this->countryArray,
                    'multiple' => false,
                    'required' => true,
                    'expanded' => true,
                    'mapped' => false,
                    'data'=>$defaultVal,
                    //'attr' => array('data-key-id' => $thirdPartyServiceKey->getId())
                    'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
            )) ;
            
            $builder ->add('form_hidden_id', 'hidden', array('data' => $this->thirdPartySettingMaster->getId(), 'mapped' => false ));

            if ($fieldType=="choice") {
                $predefinedValue = unserialize($predefinedValue);
                if ($isRequired) {
                    $builder
                    ->add($fieldKeyName, $fieldType,
                        array('label'=>$thirdPartyServiceKey->getKeyName(), 'required'=>true,
                              'multiple' => false,
                              'expanded' => true,
                              'choices'=>$predefinedValue,
                              'mapped' => false,
                              'data'=>$defaultVal,
                              'constraints' => array(new NotBlank(array('message'=>'cms.config.admin.form.label.not_blank'))),
                              'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
                             
                        ));
                } else {
                    $builder
                    ->add($fieldKeyName, $fieldType,
                        array('label'=>$thirdPartyServiceKey->getKeyName(), 'required'=>true,
                                'multiple' => false, 'expanded' => true,
                                'choices'=>$predefinedValue,
                                'mapped' => false,
                                'data'=>$defaultVal,
                                'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
                        ));
                }
            } elseif ($fieldType=="multiple_choice") {
                $fieldType ="choice";
                $predefinedValue = json_decode($predefinedValue, true);
                
                if (!is_array($multiDefVal)) {
                    $multiDefVal = json_decode($multiDefVal, true);
                }
 
                if ($isRequired) {
                    $builder
                        ->add($fieldKeyName, $fieldType,
                        array('label'=>$thirdPartyServiceKey->getKeyName(),
                              'required'=>false,
                              'expanded' => false,
                              'multiple'=>true,
                              'choices'=>$predefinedValue,
                              'mapped' => false,
                              'data'=>$multiDefVal,
                              'constraints' => array(new NotBlank(array('message'=>'cms.config.admin.form.label.not_blank'))),
                              'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
                             
                        ));
                } else {
                    $builder
                        ->add($fieldKeyName, $fieldType,
                        array('label'=>$thirdPartyServiceKey->getKeyName(),
                                    'required'=>false,
                                    'expanded' => false,
                                    'multiple'=>true,
                                    'choices'=>$predefinedValue,
                                    'mapped' => false,
                                    'data'=>$multiDefVal,
                                    'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
                                        
                            ));
                }
            } elseif ($fieldType=="text" || $fieldType=="checkbox") {
                if ($fieldType == "checkbox") {
                    $defaultVal = (bool) $defaultVal;
                }
                if ($isRequired) {
                    $builder
                    ->add($fieldKeyName, $fieldType,
                            array('label'=>$thirdPartyServiceKey->getKeyName(),
                                    'required'=>false,
                                    'mapped' => false,
                                    'data'=>$defaultVal,
                                    'constraints' => array(new NotBlank(array('message'=>'cms.config.admin.form.label.not_blank'))),
                                    'attr' => array('datakey' => $dataKey[0], 'group'=> $groupKey)
                    ));
                } else {
                    $builder
                    ->add($fieldKeyName, $fieldType,
                            array('label'=>$thirdPartyServiceKey->getKeyName(),
                             'data'=>$defaultVal,
                             'required'=>false,
                             'mapped' => false,
                             'attr' => array('datakey' => $dataKey[0],
                             'group'=> $groupKey)
                    ));
                }
            }
        }
    }
    
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'OfficeBrain\Bundle\CmsBundle\Entity\ThirdPartyServiceMeta'
        ));
    }

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