/**
  * 시나리오에 따라 문자열을 보낸다.
  * 어떤 우커머스 이벤트가 있든지, 해당 이벤트에 대한 핸들링은 적절한 메시지를 보내는 것으로 귀결된다.
  * 주의. $order_id 와 $user_id 가 동시에 NULL 이 될 수 없다.
  *
  * @param int|NULL $order_id 주문에 대한 문자열이면 주문 ID. 주문과 관련되 문자가 아니면 NULL.
  * @param int|NULL $user_id  사용자와 관련된 문자열이면 사용자 ID. 사용자와 관련 없으면 NULL.
  * @param string   $scenario 시나리오. 각 섹션의 ID. e.g., new-order, customer-new-account, ...
  *
  * @uses  WSKL_SMS_Text_Substitution
  * @uses  WSKL_Dabory_SMS_Provider_Loading
  *
  * @uses  WSKL_Dabory_SMS_Trigger::get_setting_value()
  * @uses  WSKL_Dabory_SMS_Trigger::get_settings()
  * @uses  WSKL_Dabory_SMS_Trigger::is_already_sent()
  * @uses  WSKL_Dabory_SMS_Trigger::log()
  * @uses  WSKL_Dabory_SMS_Trigger::set_sending_result()
  *
  * @return bool
  */
 private function trigger_common($order_id, $user_id, $scenario)
 {
     if ($order_id) {
         $order = wc_get_order($order_id);
         if (!$order) {
             $this->log('$order is invalid. Triggering halted.', __METHOD__);
             return FALSE;
         }
     } else {
         $order = NULL;
     }
     if ($user_id) {
         $user = get_user_by('id', $user_id);
         if (!$user) {
             $this->log("User ID {$user_id} is invalid.", __METHOD__);
             return FALSE;
         }
     } else {
         $user = NULL;
     }
     if (!$order && !$user_id) {
         $this->log('Either $order_id, or $user_id must be valid.', __METHOD__);
         return FALSE;
     }
     $emulation = wskl_is_option_enabled('develop_emulate_sms');
     // check if a message is already sent (order only)
     if (!$emulation && $order && $this->is_already_sent($order, $scenario)) {
         $this->log("Order #{$order_id} has been notified. Triggering halted.", __METHOD__);
         return FALSE;
     } else {
         if (!$emulation && $user && $this->is_already_sent($user, $scenario)) {
             $this->log("User #{$user_id} ({$user->user_email}) has been notified. Triggering halted.", __METHOD__);
             return FALSE;
         }
     }
     // receiver meta key
     $gs = self::get_settings();
     // retrieve the other fields
     $ns = self::get_settings($scenario);
     $message_template = self::get_setting_value($ns, $scenario, 'message_content');
     $title_template = self::get_setting_value($ns, $scenario, 'message_title');
     $notify_to_managers = self::get_setting_value($ns, $scenario, 'send_to_managers');
     if ($order) {
         $receiver_phone_meta_key = wskl_get_from_assoc($gs, wskl_get_option_name('sms_receiver_meta_field'));
         if (empty($receiver_phone_meta_key)) {
             $this->log('$receiver_phone_meta_key is an empty string. Triggering halted.', __METHOD__);
             return FALSE;
         }
         $customer_phone = $order->{$receiver_phone_meta_key};
     } else {
         $receiver_phone_meta_key = self::get_setting_value($ns, $scenario, 'phone_meta_field');
         if (empty($receiver_phone_meta_key)) {
             $this->log('$receiver_phone_meta_key is an empty string. Triggering halted.', __METHOD__);
             return FALSE;
         }
         $customer_phone = $user->{$receiver_phone_meta_key};
     }
     if (empty($customer_phone)) {
         $this->log('customer phone is empty! Triggering halted.', __METHOD__);
         return FALSE;
     }
     // receivers
     if ($notify_to_managers == 'yes') {
         $r = explode("\n", wskl_get_option('sms_shop_manager_phones'));
         $r[] = $customer_phone;
         $r = array_map(array(__CLASS__, 'trim_phone_number'), $r);
         $r = array_filter($r, array(__CLASS__, 'not_empty'));
         $r = array_unique($r);
         $receivers = implode(',', $r);
         $num_receivers = count($receivers);
     } else {
         $receivers = $customer_phone;
         $num_receivers = 1;
     }
     if (!$num_receivers) {
         $this->log('The number of recipient is 0! Triggering halted.', __METHOD__);
         return FALSE;
     }
     // message substitution
     $sub = new WSKL_SMS_Text_Substitution();
     $sub->init_substitute($order, $user);
     $message_title = $sub->substitute($title_template);
     $message_content = $sub->substitute($message_template);
     $str_bytes = strlen($message_content);
     // message type
     if ($str_bytes > self::SMS_MAX_BYTES) {
         $message_type = 'lms';
     } else {
         $message_type = 'sms';
     }
     $args = array('remote_phone' => $receivers, 'remote_msg' => $message_content, 'remote_subject' => $message_title, 'remote_num' => $num_receivers, 'remote_etc1' => $order_id);
     if (!$emulation) {
         // ... and fire.
         /** @var WSKL_Dabory_SMS_Provider $provider_class */
         $provider_class = Provider_Loading::get_provider_class();
         $sender = $provider_class::factory();
         $response = $sender->send_message($args, $message_type);
         assert($response[3] == $order_id, __FUNCTION__ . ': Order id of etc1 and $order_id are different. This is impossible.');
     } else {
         $message = 'SMS emulation is enabled. Argument: ' . print_r($args, TRUE);
         error_log($message);
     }
     if (!$emulation && $order) {
         self::set_sending_result($order, $scenario, $message_type);
     } else {
         if (!$emulation && $user) {
             self::set_sending_result($user, $scenario, $message_type);
         }
     }
     return TRUE;
 }
 /**
  * 일반 옵션
  *
  * @return array
  */
 private static function get_settings_general()
 {
     $auth_section = WSKL_Dabory_SMS_Provider_Loading::get_auth_section_settings();
     return array_merge($auth_section, array(array('type' => 'title', 'title' => __('문자메시지 일반 옵션', 'wskl'), 'id' => 'general_options'), array('id' => wskl_get_option_name('sms_sender_phone'), 'title' => __('발신번호', 'wskl'), 'type' => 'text', 'desc' => __('발신자의 전화번호는 반드시 사전에 발신자 등록이 되어야 합니다.', 'wskl'), 'default' => ''), array('id' => wskl_get_option_name('sms_receiver_meta_field'), 'type' => 'text', 'title' => __('전화번호 메타 필드', 'wskl'), 'desc' => __('문자메시지 발송에 필요한 고객의 휴대전화를 저장하는 메타 필드의 이름입니다. 기본값: billing_phone', 'wskl'), 'default' => 'billing_phone'), array('id' => wskl_get_option_name('sms_shop_manager_phones'), 'title' => '상점관리자 수신번호', 'type' => 'textarea', 'desc' => __('상점관리자의 전화번호를 한 줄에 하나씩 입력합니다.', 'wskl'), 'custom_attributes' => array('rows' => 10, 'cols' => 18), 'default' => ''), array('type' => 'message_tester'), array('type' => 'sectionend', 'id' => 'general_options')));
 }