lib/wechat/server_message/reply_message.ex

defmodule WeChat.ServerMessage.ReplyMessage do
  @moduledoc """
  被动回复消息

  [官方文档](https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html){:target="_blank"}
  """
  import WeChat.Utils, only: [def_eex: 2]

  @doc_link "https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html"

  @doc """
  回包加密 -
  [官方文档](https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Message_Encryption/Message_encryption_and_decryption.html)

  ```xml
  <xml>
    <Encrypt><![CDATA[encrypt_content]]></Encrypt>
    <MsgSignature><![CDATA[signature]]></MsgSignature>
    <TimeStamp>timestamp</TimeStamp>
    <Nonce><![CDATA[nonce]]></Nonce>
  </xml>
  ```
  """
  def_eex reply_msg(signature, nonce, timestamp, encrypt_content) do
    """
    <xml>
      <Encrypt><![CDATA[<%= encrypt_content %>]]></Encrypt>
      <MsgSignature><![CDATA[<%= signature %>]]></MsgSignature>
      <TimeStamp><%= timestamp %></TimeStamp>
      <Nonce><![CDATA[<%= nonce %>]]></Nonce>
    </xml>
    """
  end

  @doc """
  回复文本消息 -
  [官方文档](#{@doc_link}#0){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>text</MsgType>
    <Content><![CDATA[你好]]></Content>
  </xml>
  ```
  """
  def_eex reply_text(to_openid, from_wx_no, timestamp, content) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>text</MsgType>
      <Content><![CDATA[<%= content %>]]></Content>
    </xml>
    """
  end

  @doc """
  回复图片消息 -
  [官方文档](#{@doc_link}#1){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>image</MsgType>
    <Image>
      <MediaId><![CDATA[media_id]]></MediaId>
    </Image>
  </xml>
  ```
  """
  def_eex reply_image(to_openid, from_wx_no, timestamp, media_id) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>image</MsgType>
      <Image>
        <MediaId><![CDATA[<%= media_id %>]]></MediaId>
      </Image>
    </xml>
    """
  end

  @doc """
  回复语音消息 -
  [官方文档](#{@doc_link}#2){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>voice</MsgType>
    <Voice>
      <MediaId><![CDATA[media_id]]></MediaId>
    </Voice>
  </xml>
  ```
  """
  def_eex reply_voice(to_openid, from_wx_no, timestamp, media_id) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>voice</MsgType>
      <Voice>
        <MediaId><![CDATA[<%= media_id %>]]></MediaId>
      </Voice>
    </xml>
    """
  end

  @doc """
  回复视频消息 -
  [官方文档](#{@doc_link}#3){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>video</MsgType>
    <Video>
      <MediaId><![CDATA[media_id]]></MediaId>
      <Title><![CDATA[title]]></Title>
      <Description><![CDATA[description]]></Description>
    </Video>
  </xml>
  ```
  """
  def_eex reply_video(to_openid, from_wx_no, timestamp, media_id, title, desc) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>video</MsgType>
      <Video>
        <MediaId><![CDATA[<%= media_id %>]]></MediaId>
        <Title><![CDATA[<%= title %>]]></Title>
        <Description><![CDATA[<%= desc %>]]></Description>
      </Video>
    </xml>
    """
  end

  @doc """
  回复音乐消息 -
  [官方文档](#{@doc_link}#4){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>music</MsgType>
    <Music>
      <Title><![CDATA[title]]></Title>
      <Description><![CDATA[description]]></Description>
      <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
      <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
      <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
    </Music>
  </xml>
  ```
  """
  def_eex reply_music(
            to_openid,
            from_wx_no,
            timestamp,
            title,
            desc,
            music_url,
            hq_music_url,
            thumb_media_id
          ) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>music</MsgType>
      <Music>
        <Title><![CDATA[<%= title %>]]></Title>
        <Description><![CDATA[<%= desc %>]]></Description>
        <MusicUrl><![CDATA[<%= music_url %>]]></MusicUrl>
        <HQMusicUrl><![CDATA[<%= hq_music_url %>]]></HQMusicUrl>
        <ThumbMediaId><![CDATA[<%= thumb_media_id %>]]></ThumbMediaId>
      </Music>
    </xml>
    """
  end

  @doc """
  回复图文消息 -
  [官方文档](#{@doc_link}#5){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType>news</MsgType>
    <ArticleCount>1</ArticleCount>
    <Articles>
      <item>
        <Title><![CDATA[title1]]></Title>
        <Description><![CDATA[description1]]></Description>
        <PicUrl><![CDATA[picurl]]></PicUrl>
        <Url><![CDATA[url]]></Url>
      </item>
    </Articles>
  </xml>
  ```
  """
  def_eex reply_news(to_openid, from_wx_no, timestamp, article_items) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>news</MsgType>
      <ArticleCount><%= length(article_items) %></ArticleCount>
      <Articles>
        <%= for article_item <- article_items do %>
        <item>
          <Title><![CDATA[<%= article_item.title %>]]></Title>
          <Description><![CDATA[<%= article_item.desc %>]]></Description>
          <PicUrl><![CDATA[<%= article_item.pic_url %>]]></PicUrl>
          <Url><![CDATA[<%= article_item.url %>]]></Url>
        </item>
        <% end %>
      </Articles>
    </xml>
    """
  end

  @doc """
  消息转发客服消息 -
  [官方文档](https://developers.weixin.qq.com/doc/offiaccount/Customer_Service/Forwarding_of_messages_to_service_center.html){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[touser]]></ToUserName>
    <FromUserName><![CDATA[fromuser]]></FromUserName>
    <CreateTime>1399197672</CreateTime>
    <MsgType>transfer_customer_service</MsgType>
  </xml>
  ```
  """
  def_eex transfer_customer_service(to_openid, from_wx_no, timestamp) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>transfer_customer_service</MsgType>
    </xml>
    """
  end

  @doc """
  消息转发到指定客服 -
  [官方文档](https://developers.weixin.qq.com/doc/offiaccount/Customer_Service/Forwarding_of_messages_to_service_center.html){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[touser]]></ToUserName>
    <FromUserName><![CDATA[fromuser]]></FromUserName>
    <CreateTime>1399197672</CreateTime>
    <MsgType>transfer_customer_service</MsgType>
    <TransInfo>
      <KfAccount><![CDATA[test1@test]]></KfAccount>
    </TransInfo>
  </xml>
  ```
  """
  def_eex transfer_customer_service(to_openid, from_wx_no, timestamp, kf_account) do
    """
    <xml>
      <ToUserName><![CDATA[<%= to_openid %>]]></ToUserName>
      <FromUserName><![CDATA[<%= from_wx_no %>]]></FromUserName>
      <CreateTime><%= timestamp %></CreateTime>
      <MsgType>transfer_customer_service</MsgType>
      <TransInfo>
        <KfAccount><![CDATA[<%= kf_account %>]]></KfAccount>
      </TransInfo>
    </xml>
    """
  end

  @doc """
  模板卡片更新消息(更新点击用户的按钮文案) -
  [官方文档](https://developer.work.weixin.qq.com/document/path/90241#更新点击用户的按钮文案){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType>update_button</MsgType>
    <Button>
        <ReplaceName><![CDATA[ReplaceName]]></ReplaceName>
    </Button>
  </xml>
  ```
  """
  def_eex update_template_card_button(to_user, from_user, timestamp, replace_name) do
    """
    <xml>
    <ToUserName><![CDATA[<%= to_user %>]]></ToUserName>
    <FromUserName><![CDATA[<%= from_user %>]]></FromUserName>
    <CreateTime><%= timestamp %></CreateTime>
    <MsgType>update_button</MsgType>
    <Button>
        <ReplaceName><![CDATA[<%= replace_name %>]]></ReplaceName>
    </Button>
    </xml>
    """
  end

  @doc """
  模板卡片更新消息(更新点击用户的整张卡片) -
  [官方文档](https://developer.work.weixin.qq.com/document/path/90241#更新点击用户的整张卡片){:target="_blank"}

  ```xml
  <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>1357290913</CreateTime>
    <MsgType>update_button</MsgType>
    template_card_xml
  </xml>
  ```
  """
  def_eex update_template_card(to_user, from_user, timestamp, template_card_xml) do
    """
    <xml>
    <ToUserName><![CDATA[<%= to_user %>]]></ToUserName>
    <FromUserName><![CDATA[<%= from_user %>]]></FromUserName>
    <CreateTime><%= timestamp %></CreateTime>
    <MsgType>update_template_card</MsgType>
    <%= template_card_xml %>
    </xml>
    """
  end

  def biz_msg_menu(show_text, reply_text \\ nil, id \\ 0) do
    reply_text = reply_text || show_text

    "<a href=\"weixin://bizmsgmenu?msgmenucontent=#{reply_text}&msgmenuid=#{id}\">#{show_text}</a>"
  end
end