<?php
class messageActions extends sfMyActions {

  public function executeIndex() {
    $this->executeMailbox();
    $this->setTemplate('mailbox');
  }

  public function executeMailbox() {
    $this->us_id = $this->getUser()->getUserId();
    $this->box_type = $this->getRequestParameter('type', 'inbox');
    $this->forward404Unless(in_array($this->box_type, array('inbox', 'outbox', 'compose')), 'Đường dẫn không hợp lệ');

    $ms_id = $this->getRequestParameter('ms_id');
    if ($ms_id) { //show or reply
      $this->mail = TblusermessagePeer::retrieveByPK($ms_id);
      $this->forward404Unless($this->mail, 'Tin nhắn không tồn tại');
      $this->forward404If($this->box_type=='outbox' && $this->us_id!=$this->mail->getMsFrom(), 'Tin nhắn không phải của bạn gửi');
      $this->forward404If($this->box_type!='outbox' && $this->us_id!=$this->mail->getMsTo(), 'Tin nhắn không phải của bạn nhận');
    }

    $this->partner = $this->getRequestParameter('partner');
    if ($this->partner) { //inbox or outbox
      $this->tbluser = TbluserPeer::retrieveByPK($this->partner);
      $this->forward404Unless($this->tbluser, 'Người gửi hoặc người nhận không tồn tại');
    }
  }
  
  public function executeDelete() {
    $us_id = $this->getUser()->getUserId();
    $ms_id = $this->getRequestParameter('ms_id');
    $ms_list = $ms_id? array($ms_id): $this->getRequestParameter('items');
    $box_type = $this->getRequestParameter('type');
    $this->forward404Unless($ms_list && in_array($box_type, array('inbox', 'outbox')), 'Đường dẫn không hợp lệ');

    foreach ($ms_list as $ms_id) {
      $mail = TblusermessagePeer::retrieveByPK($ms_id);
      $this->forward404Unless($mail, 'Tin nhắn không tồn tại');
      if ($box_type == 'inbox') {
        $this->forward404If($us_id != $mail->getMsTo(), 'Tin nhắn không phải của bạn nhận');
        $mail->setMsDeleted($mail->getMsDeleted() | 2);
      } else {
        $this->forward404If($us_id != $mail->getMsFrom(), 'Tin nhắn không phải của bạn gửi');
        $mail->setMsDeleted($mail->getMsDeleted() | 1);
      }
      $mail->save();
    }
    $ret = $this->getRequestParameter('retLink');
    $ret = $ret? urldecode($ret): $this->getRequest()->getReferer();
    $this->redirect($ret);
  }

  public function executeSend() {
    $this->forward404If($this->getRequest()->getMethod() != sfRequest::POST, 'Phương thức gửi không hợp lệ');
    $us_id = $this->getUser()->getUserId();
    $ms_id = $this->getRequestParameter('ms_id');

    if ($ms_id) { //reply
      $mail = TblusermessagePeer::retrieveByPk($ms_id);
      $this->forward404Unless($mail, 'Tin nhắn không tồn tại');
      $this->forward404Unless($mail->getMsTo() == $us_id, 'Tin nhắn không gửi cho bạn nên không thể trả lời');
      $ms_to = $mail->getMsFrom();
    } else {
      $addr = $this->getRequestParameter('ms_address');
      $c = $this->getUserCriteria($addr);
      $count = TbluserPeer::doCount($c);
      if ($count != 1) {
        if ($count < 1) $this->getRequest()->setError('ms_address', 'Địa chỉ không chính xác');
        if ($count > 1) $this->getRequest()->setError('ms_address', 'Địa chỉ không rõ ràng, hãy dùng chức năng Tìm kiếm');
        return $this->handleErrorSend();
      }
      $ms_to = TbluserPeer::doSelectOne($c)->getUsId();
    }
    $ms_subject = $this->getRequestParameter('ms_subject');
    $ms_content = $this->getRequestParameter('ms_content');
    $this->forward404Unless($ms_subject && $ms_content, 'Tiêu đề hoặc nội dung chưa có');

    $message = new Tblusermessage();
    $message->setMsFrom($us_id);
    $message->setMsTo($ms_to);
    $message->setMsSubject($ms_subject);
    $message->setMsContent($ms_content);
    $message->setMsTime(date('Y-m-d H:i:s'));
    $message->setMsPrev($ms_id);
    $message->save();

    if ($ms_id) {
      $mail->setMsNext($message->getMsId());
      $mail->save();
    }
    $this->redirect('/message/mailbox?type=outbox');
  }

  public function handleErrorSend() {
    $this->box_type = 'compose';
    $this->setTemplate('mailbox');
    return sfView::SUCCESS;
  }

  private function getUserCriteria($name) {
    if (preg_match('/(.*)<(.*)>/', $name, $match)) {
      $name = trim($match[1]);
      $user = trim($match[2]);
    } else {
      $user = $name;
    }
    $c = new Criteria();
    $criterion = $c->getNewCriterion(TbluserPeer::US_USERNAME, $user);
    $criterion->addOr($c->getNewCriterion(TbluserPeer::US_EMAIL, $user));
    $key_array = explode(' ', $name);
    if (count($key_array) > 1) {
      $first = array_pop($key_array);
      $last = implode(' ', $key_array);
      $c2 = $c->getNewCriterion(TbluserPeer::US_FIRSTNAME, $first);
      $c2->addAnd($c->getNewCriterion(TbluserPeer::US_LASTNAME, $last));
      if ($user != $name) $c->add($c2);
      else $criterion->addOr($c2);
    }
    $c->add($criterion);
    return $c;
  }

  public function executeSearch() {
    $addr = $this->getRequestParameter('ms_address');
    $c = $this->getUserCriteria($addr);
    $c->setLimit(40);
    $this->users = TbluserPeer::doSelect($c);
  }

  public function executeShowcontent() {
    $this->ms_id = $this->getRequestParameter('ms_id');
    $this->hide = $this->getRequestParameter('hide', 0);
  }
}
