<?php

namespace Neag\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;
use Neag\MainBundle\Entity\Feedback;
use \DateTime;
//use Neag\MainBundle\Controller;

class FeedbackController extends ControllerAbstract
{ 

    /**
     * @Route("/feedback")
     * @Template("NeagMainBundle:Feedback:feedback.html.twig")
     */
    public function feedbackAction()
    {                                      
        $globals = $this->get('globals');
        $is_mobile = $globals->isMobile();
        $request = $this->getRequest();
        
        $desktop_link = $this->generateURL('feedback', array_merge(Array(), $this->get('request')->query->all()));
        $mobile_link = $this->generateURL('feedback_m', array_merge(Array(), $this->get('request')->query->all()));
        $globals->setDesktopLink($desktop_link);
        $globals->setMobileLink($mobile_link);
        
        $is_logged_in = $globals->isUserLoggedIn();
        if ($is_logged_in) {
            $user_info = $globals->getUserInfo();
        }
        
        $Feedback = new Feedback();
        $builder = $this->createFormBuilder($Feedback);       
        if (!$is_logged_in) {
            $builder->add('name', 'text', Array('label' => 'Ваше имя', 'trim' => true, 'required' => true));
        } else {
            $builder->add('name', 'text', Array('label' => 'Ваше имя', 'data' => $user_info['name'], 'disabled' => true, 'required' => false));
        }
        $default_email = '';      
        if ($is_logged_in) {
            //$this->trace($user_info);
            if (!empty($user_info['email'])) {
                $default_email = $user_info['email'];
            }
        }
        $builder->add('email', 'email', Array('label' => 'E-mail', 'trim' => true, 'required' => true, 'data' => $default_email));        
        $builder->add('text', 'textarea', Array('label' => 'Текст сообщения', 'trim' => true, 'required' => true));
        $this->securityAlterForm($builder);
        $form = $builder->getForm();
        
        if ($request->isMethod('POST')) {
            $submitted_values = $_POST[$form->getName()];
            $form->bind($submitted_values);
            $this->securityValidateForm($form, $submitted_values);
            $globals->blockRulesValidateForm($form, $submitted_values['name'], $submitted_values['text'], 'feedback');
            // Проверка на IP
            if (!$globals->isUserLoggedIn()) {
                if (!$globals->checkIPAvailable()) {
                    $formerror = new \Symfony\Component\Form\FormError('Вы пытаетесь отправить сообщение из недопустимого места. Все анонимные сообщения принимаются только из России. Вы можете авторизоваться на сайте, чтобы этого ограничения не было.', 'text');
                    $form->addError($formerror);
                    //return false;
                }
            }
            // Проверка на длину сообщения
            if (!empty($submitted_values['text'])) { 
                /*
                $matches = preg_split('/'.preg_quote(" \n\r\n").'/is');
                //$words = explode(Array(' ', "\n\r", "\n"), $submitted_values['text']);
                for ($i=0; isset($words[$i]); $i++) {
                    if (empty($words[$i])) {
                        unset($words[$i]);
                    }
                }
                */
                preg_match_all("/\b(\w+)\b/ui", $submitted_values['text'], $matches);
                $words = $matches[1];
                $count = count($words);
                if ($count <= 3) {
                    $formerror = new \Symfony\Component\Form\FormError('Слишком короткий текст сообщения', 'text');
                    $form->addError($formerror);
                }
                /*
                foreach ($words as &$word) {
                    if (empty($word)) {
                        unset($word);
                    }
                }
                */
            } else {
                $formerror = new \Symfony\Component\Form\FormError('Не введено сообщение', 'text');
                $form->addError($formerror);
            }
            if ($form->isValid()) {
                $time = date('Y-m-d H:i:s', time());               
                if ($is_logged_in) {
                    $Feedback->setName($user_info['name']);
                    $Feedback->setUser($user_info['entity']);
                }    
                $Feedback->setIp($request->getClientIp());
                $Feedback->setCookieId($this->getCookieId());                
                $Feedback->setTime(new \DateTime($time));                
                $em = $this->getDoctrine()->getManager();                
                $em->persist($Feedback);
                $em->flush();
                if (!$is_logged_in) {
                    $name = $submitted_values['name'];
                } else {
                    $name = $user_info['name'];
                }
                $email = $submitted_values['email'];
                // Отпарвка по e-mail
                $body = 'Имя отправителя: '.$name."\n";
                if ($is_logged_in) {
                    //$body .= 'Информация пользователя: '.$user_info['profile_link']."\n";
                    $body .= 'Информация пользователя: '.$this->generateURL('user_info', Array('id' => $user_info['id']), true)."\n";
                }
                $body .= 'E-mail: '.$email."\n"
                .'Текст сообщения: '."\n"
                .$submitted_values['text']."\n"."\n"
                .'IP: '.$request->getClientIp()."\n"
                .'COOKIE-идентификатор: '.$this->getCookieId()."\n"
                .'Время отправки: '.$time."\n"."\n"
                .'Письмо отправлено почтовым роботом. Отвечать на него не нужно. Ответы следует отправлять на e-mail "'.$email.'".';
                $globals->mail($globals->getConfigVar('feedback_email'), 'Пришло сообщение по обратной связи', $body);
                $this->message('Спасибо за ваше сообщение', 'ok');
                if (!$is_mobile) {
                    $redirect = $this->generateUrl('feedback');
                } else {
                    $redirect = $this->generateUrl('feedback_m'); 
                }
                return $this->redirect($redirect);                
            }                
        }
        
        if (!$is_mobile) {
            $action = $this->generateURL('feedback');  
        } else {
            $action = $this->generateURL('feedback_m');  
        }
        
        return Array('is_mobile' => $is_mobile, 'action' => $action, 'is_logged_in' => $is_logged_in, 'form' => $form->createView());        
    }       

}

?>
