/**
  * Function to add or update segment
  * 
  * @param array $params
  * @return array $result
  * @throws Exception when params empty
  * @access public
  * @static
  */
 public static function add($params)
 {
     $result = array();
     $preSegment = array();
     if (empty($params)) {
         throw new Exception('Params can not be empty when adding or updating a segment', 9003);
     }
     $segment = new CRM_Contactsegment_BAO_Segment();
     if (isset($params['id'])) {
         $segment->id = $params['id'];
         // pre hook if edit
         $op = "edit";
         self::storeValues($segment, $preSegment);
         CRM_Utils_Hook::pre($op, 'Segment', $segment->id, $preSegment);
         $segment->find(true);
     } else {
         $op = "create";
     }
     $fields = self::fields();
     foreach ($params as $paramKey => $paramValue) {
         if (isset($fields[$paramKey])) {
             $segment->{$paramKey} = $paramValue;
         }
     }
     if (!$segment->name && $segment->label) {
         $segment->name = CRM_Contactsegment_Utils::generateNameFromLabel($segment->label);
     }
     $segment->save();
     if (!$segment->is_active) {
         CRM_Contactsegment_BAO_Segment::setInactive($segment->id);
     }
     // post hook
     CRM_Utils_Hook::post($op, 'Segment', $segment->id, $segment);
     self::storeValues($segment, $result);
     return $result;
 }