<?php

namespace OfficeBrain\CustomBundle\ServiceGroupBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Range;
use Symfony\Component\Validator\ExecutionContextInterface;
use Symfony\Component\Validator\Constraints as Assert;

class PromoCouponType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    	//$discountTypes = array('eqp_discount_flat','eqp_discount_percent','discount_flat','discount_percent');
    	
        $builder
            ->add('couponName', 'text')
            ->add('couponType', 'choice', array('choices' => array(''=>'Select Coupon Type','eqp'=>'EQP','eqp_discount_flat'=>'EQP + Discount ($)', 'eqp_discount_percent'=>'EQP + Discount (%)','next_column'=>'Next Column','discount_flat'=>'Discount ($)','discount_percent'=>'Discount (%)')))
            ->add('discount', 'text')
			->add('startDate', 'date', array('format' => 'yyyy-MM-dd', 'read_only' => true, 'widget' => 'single_text'))
			->add('endDate', 'date', array('format' => 'yyyy-MM-dd', 'read_only' => true, 'widget' => 'single_text'))
			->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
				$data = $event->getData();
				$form = $event->getForm();
			
				if (isset($data['couponType']) && ($data['couponType']=='eqp_discount_flat' || $data['couponType']=='eqp_discount_percent' || $data['couponType']=='discount_flat' || $data['couponType']=='discount_percent')) {
					$form->add('discount', 'text',
							array(
									'constraints' => new NotBlank(
											array(
													'message' => 'service_group.coupon_type.not_blank',
											)
									),
									'constraints' => array(
											new NotBlank(array('message' => 'service_group.discount_code.not_blank')),
											new Range(array(
													'min'   	=> 0.001,
													'max' 		=> 100,
													'minMessage' => "service_group.coupon_type.invalid",
													'maxMessage' => "service_group.coupon_type.invalid"
											)),
									),
							)
					);
				}
				
				$form->add('startDate', 'date', array('format' => 'yyyy-MM-dd', 'read_only' => true, 'widget' => 'single_text',
						'constraints' => array(
                        	new Assert\Callback(array('methods' => array(array($this, 'checkStartDate')))),
                        )
				));
				$form->add('endDate', 'date', array('format' => 'yyyy-MM-dd', 'read_only' => true, 'widget' => 'single_text',
						'constraints' => array(
								new Assert\Callback(array('methods' => array(array($this, 'checkEndDate')))),
								new Assert\Callback(array('methods' => array(array($this, 'checkEndDateIsMax')))),
									
						)
				));
			})
            ->add('status', 'choice', array(
                    'required' => true,
                    'multiple' => false,
                    'choices' => array(1 => 'Active', 0 => 'In Active'),
            		'data' => 1
              ));
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'OfficeBrain\CustomBundle\ServiceGroupBundle\Entity\PromoCoupon', 'cascade_validation' => true,
            'error_bubbling' => true,
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'officebrain_bundle_servicegroupbundle_promocoupon';
    }
    
	public function checkStartDate($data, ExecutionContextInterface $context)
    {
        if ($data == null) {
            $context->addViolation('service_group.start_date.not_blank');
        }
        $this->startDate = $data;
    }
    public function checkEndDate($data, ExecutionContextInterface $context)
    {
    	if ($data == null) {
            $context->addViolation('service_group.end_date.not_blank');
        }
        $this->endDate = $data;
    }

    public function checkEndDateIsMax($data, ExecutionContextInterface $context)
    {
        if ($this->startDate && $this->endDate) {
            if ($this->startDate > $this->endDate) {
                $context->addViolation('admin.charges_rule_mapping.end_date.greater_start_date');
            }
        }
    }
    
    public function checkMyDate($date)
    {
    	if ($date && $date != null) {
    		return (checkdate($date->format('m'), $date->format('d'), $date->format('Y')));
    	}
    
    	return true;
    }
}
