/**
  * Create a session
  * @author Carlos Vargas <*****@*****.**>, from existing code
  * @param   string  $name
  * @param   string  $startDate (YYYY-MM-DD hh:mm:ss)
  * @param   string  $endDate (YYYY-MM-DD hh:mm:ss)
  * @param   string  $displayStartDate (YYYY-MM-DD hh:mm:ss)
  * @param   string  $displayEndDate (YYYY-MM-DD hh:mm:ss)
  * @param   string  $coachStartDate (YYYY-MM-DD hh:mm:ss)
  * @param   string  $coachEndDate (YYYY-MM-DD hh:mm:ss)
  * @param   mixed   $coachId If integer, this is the session coach id, if string, the coach ID will be looked for from the user table
  * @param   integer $sessionCategoryId ID of the session category in which this session is registered
  * @param   integer $visibility Visibility after end date (0 = read-only, 1 = invisible, 2 = accessible)
  * @param   bool    $fixSessionNameIfExists
  * @param   string  $duration
  * @param   string  $description Optional. The session description
  * @param   int     $showDescription Optional. Whether show the session description
  * @param   array   $extraFields
  * @param   int     $sessionAdminId Optional. If this sessions was created by a session admin, assign it to him
  * @param boolean $sendSubscritionNotification Optional.
  *          Whether send a mail notification to users being subscribed
  * @todo use an array to replace all this parameters or use the model.lib.php ...
  * @return mixed       Session ID on success, error message otherwise
  * */
 public static function create_session($name, $startDate, $endDate, $displayStartDate, $displayEndDate, $coachStartDate, $coachEndDate, $coachId, $sessionCategoryId, $visibility = 1, $fixSessionNameIfExists = false, $duration = null, $description = null, $showDescription = 0, $extraFields = array(), $sessionAdminId = 0, $sendSubscritionNotification = false)
 {
     $em = Database::getManager();
     /*
             if (is_array($_configuration[$access_url_id]) &&
                 isset($_configuration[$access_url_id]['hosting_limit_sessions']) &&
                 $_configuration[$access_url_id]['hosting_limit_sessions'] > 0
             ) {
                 $num = self::count_sessions();
                 if ($num >= $_configuration[$access_url_id]['hosting_limit_sessions']) {
                     api_warn_hosting_contact('hosting_limit_sessions');
                     return get_lang('PortalSessionsLimitReached');
                 }
             }*/
     $name = trim($name);
     $sessionCategoryId = intval($sessionCategoryId);
     $visibility = intval($visibility);
     $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
     if (empty($name)) {
         $msg = get_lang('SessionNameIsRequired');
         return $msg;
     } elseif (empty($coachId)) {
         $msg = get_lang('CoachIsRequired');
         return $msg;
     } elseif (!empty($startDate) && !api_is_valid_date($startDate, 'Y-m-d H:i') && !api_is_valid_date($startDate, 'Y-m-d H:i:s')) {
         $msg = get_lang('InvalidStartDate');
         return $msg;
     } elseif (!empty($endDate) && !api_is_valid_date($endDate, 'Y-m-d H:i') && !api_is_valid_date($endDate, 'Y-m-d H:i:s')) {
         $msg = get_lang('InvalidEndDate');
         return $msg;
     } elseif (!empty($startDate) && !empty($endDate) && $startDate >= $endDate) {
         $msg = get_lang('StartDateShouldBeBeforeEndDate');
         return $msg;
     } else {
         $ready_to_create = false;
         if ($fixSessionNameIfExists) {
             $name = self::generateNextSessionName($name);
             if ($name) {
                 $ready_to_create = true;
             } else {
                 $msg = get_lang('SessionNameAlreadyExists');
                 return $msg;
             }
         } else {
             $rs = Database::query("SELECT 1 FROM {$tbl_session} WHERE name='" . $name . "'");
             if (Database::num_rows($rs)) {
                 $msg = get_lang('SessionNameAlreadyExists');
                 return $msg;
             }
             $ready_to_create = true;
         }
         if ($ready_to_create) {
             $sessionAdminId = !empty($sessionAdminId) ? $sessionAdminId : api_get_user_id();
             $session = new Session();
             $session->setName($name)->setVisibility($visibility)->setDescription($description)->setShowDescription($showDescription)->setSendSubscriptionNotification($sendSubscritionNotification)->setSessionAdminId($sessionAdminId);
             if (!empty($coachId)) {
                 $coach = UserManager::getManager()->find($coachId);
                 if ($coach) {
                     $session->setGeneralCoach($coach);
                 }
             }
             if (!empty($startDate)) {
                 $session->setAccessStartDate(new \DateTime($startDate));
             }
             if (!empty($endDate)) {
                 $session->setAccessEndDate(new \DateTime($endDate));
             }
             if (!empty($displayStartDate)) {
                 $session->setDisplayStartDate(new \DateTime($displayStartDate));
             }
             if (!empty($displayEndDate)) {
                 $session->setDisplayEndDate(new \DateTime($displayEndDate));
             }
             if (!empty($coachStartDate)) {
                 $session->setCoachAccessStartDate(new \DateTime($coachStartDate));
             }
             if (!empty($coachEndDate)) {
                 $session->setCoachAccessEndDate(new \DateTime($coachEndDate));
             }
             if (!empty($sessionCategoryId)) {
                 $session->setCategory($sessionCategoryId);
             }
             $duration = intval($duration);
             if (!empty($duration)) {
                 $session->setDuration($duration);
                 $session->setAccessStartDate(null);
                 $session->setAccessEndDate(null);
                 $session->setDisplayStartDate(null);
                 $session->setDisplayEndDate(null);
                 $session->setCoachAccessStartDate(null);
                 $session->setCoachAccessEndDate(null);
             } else {
                 $session->setDuration(0);
             }
             $url = $em->getRepository('ChamiloCoreBundle:AccessUrl')->find(api_get_current_access_url_id());
             $accessRelSession = new \Chamilo\CoreBundle\Entity\AccessUrlRelSession();
             $accessRelSession->setUrl($url);
             $session->addUrls($accessRelSession);
             $em->persist($session);
             $em->flush();
             $session_id = $session->getId();
             if (!empty($session_id)) {
                 $extraFields['item_id'] = $session_id;
                 $sessionFieldValue = new ExtraFieldValue('session');
                 $sessionFieldValue->saveFieldValues($extraFields);
                 /*
                  Sends a message to the user_id = 1
                 
                  $user_info = api_get_user_info(1);
                  $complete_name = $user_info['firstname'].' '.$user_info['lastname'];
                  $subject = api_get_setting('platform.site_name').' - '.get_lang('ANewSessionWasCreated');
                  $message = get_lang('ANewSessionWasCreated')." <br /> ".get_lang('NameOfTheSession').' : '.$name;
                  api_mail_html($complete_name, $user_info['email'], $subject, $message);
                 *
                 */
                 //Adding to the correct URL
                 $access_url_id = api_get_current_access_url_id();
                 UrlManager::add_session_to_url($session_id, $access_url_id);
                 // add event to system log
                 $user_id = api_get_user_id();
                 Event::addEvent(LOG_SESSION_CREATE, LOG_SESSION_ID, $session_id, api_get_utc_datetime(), $user_id);
             }
             return $session_id;
         }
     }
 }