lib/wechat/mini_program/live/room.ex

defmodule WeChat.MiniProgram.Live.Room do
  @moduledoc """
  小程序 - 直播间管理
  """
  import Jason.Helpers
  import WeChat.Utils, only: [doc_link_prefix: 0]
  alias WeChat.{User, MiniProgram.Live.Goods}

  @doc_link "#{doc_link_prefix()}/miniprogram/dev/framework/liveplayer/studio-api.html"

  @type start :: integer
  @type limit :: 1..100
  @type room_id :: integer

  @type user :: %{username: User.username(), nickname: User.nickname()}
  @type users :: [user]

  @typedoc "是否开启官方收录 【1: 开启,0:关闭】"
  @type is_feeds_public :: boolean | 0 | 1
  @typedoc "是否关闭回放 【0:开启,1:关闭】"
  @type is_close_replay :: boolean | 0 | 1
  @typedoc "是否关闭客服 【0:开启,1:关闭】"
  @type is_close_kf :: boolean | 0 | 1
  @typedoc "是否开启禁言 【0:开启,1:关闭】"
  @type is_ban_comment :: boolean | 0 | 1
  @typedoc "上下架 【0:下架,1:上架】"
  @type is_on_sale :: boolean | 0 | 1

  @doc """
  创建直播间 -
  [官方文档](#{@doc_link}#1){:target="_blank"}

  该接口可直接创建直播间,创建成功后直播间将在直播间列表展示
  """
  @spec create_room(WeChat.client(), data :: map) :: WeChat.response()
  def create_room(client, data) do
    client.post(
      "/wxaapi/broadcast/room/create",
      data,
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  获取直播房间列表 -
  [官方文档](#{@doc_link}#2){:target="_blank"}

  该接口可获取直播房间列表
  """
  @spec get_live_info(WeChat.client(), start, limit) :: WeChat.response()
  def get_live_info(client, start \\ 0, limit \\ 10) do
    client.post(
      "/wxa/business/getliveinfo",
      json_map(start: start, limit: limit),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  获取直播间回放 -
  [官方文档](#{@doc_link}#3){:target="_blank"}

  该接口可在直播结束后拿到回放源视频
  """
  @spec get_replay(WeChat.client(), room_id, start, limit) :: WeChat.response()
  def get_replay(client, room_id, start \\ 0, limit \\ 10) do
    client.post(
      "/wxa/business/getliveinfo",
      json_map(action: "get_replay", room_id: room_id, start: start, limit: limit),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  直播间导入商品 -
  [官方文档](#{@doc_link}#4){:target="_blank"}

  调用此接口往指定直播间导入已入库的商品
  """
  @spec add_goods(WeChat.client(), room_id, Goods.goods_ids()) :: WeChat.response()
  def add_goods(client, room_id, goods_ids) do
    client.post(
      "/wxaapi/broadcast/room/addgoods",
      json_map(roomId: room_id, ids: goods_ids),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  删除直播间 -
  [官方文档](#{@doc_link}#5){:target="_blank"}
  """
  @spec delete_room(WeChat.client(), room_id) :: WeChat.response()
  def delete_room(client, room_id) do
    client.post(
      "/wxaapi/broadcast/room/deleteroom",
      json_map(id: room_id),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  编辑直播间 -
  [官方文档](#{@doc_link}#6){:target="_blank"}
  """
  @spec edit_room(WeChat.client(), data :: map) :: WeChat.response()
  def edit_room(client, data) do
    client.post(
      "/wxaapi/broadcast/room/editroom",
      data,
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  获取直播间推流地址 -
  [官方文档](#{@doc_link}#7){:target="_blank"}
  """
  @spec get_push_url(WeChat.client(), room_id) :: WeChat.response()
  def get_push_url(client, room_id) do
    client.get("/wxaapi/broadcast/room/getpushurl",
      query: [roomId: room_id, access_token: client.get_access_token()]
    )
  end

  @doc """
  获取直播间分享二维码 -
  [官方文档](#{@doc_link}#8){:target="_blank"}
  """
  @spec get_shared_code(WeChat.client(), room_id, params :: map) :: WeChat.response()
  def get_shared_code(client, room_id, params \\ %{}) do
    query = [
      roomId: room_id,
      access_token: client.get_access_token()
    ]

    query =
      if Enum.empty?(params) do
        query
      else
        [{:params, Jason.encode!(params)} | query]
      end

    client.get("/wxaapi/broadcast/room/getsharedcode", query: query)
  end

  @doc """
  添加管理直播间小助手 -
  [官方文档](#{@doc_link}#9){:target="_blank"}
  """
  @spec add_assistant(WeChat.client(), room_id, users) :: WeChat.response()
  def add_assistant(client, room_id, users) do
    client.post(
      "/wxaapi/broadcast/room/addassistant",
      json_map(roomId: room_id, users: users),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  修改管理直播间小助手 -
  [官方文档](#{@doc_link}#10){:target="_blank"}
  """
  @spec modify_assistant(WeChat.client(), room_id, User.username(), User.nickname()) ::
          WeChat.response()
  def modify_assistant(client, room_id, username, nickname) do
    client.post(
      "/wxaapi/broadcast/room/modifyassistant",
      json_map(roomId: room_id, username: username, nickname: nickname),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  删除管理直播间小助手 -
  [官方文档](#{@doc_link}#11){:target="_blank"}
  """
  @spec remove_assistant(WeChat.client(), room_id, User.username()) :: WeChat.response()
  def remove_assistant(client, room_id, username) do
    client.post(
      "/wxaapi/broadcast/room/removeassistant",
      json_map(roomId: room_id, username: username),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  查询管理直播间小助手 -
  [官方文档](#{@doc_link}#12){:target="_blank"}
  """
  @spec get_assistant_list(WeChat.client(), room_id) :: WeChat.response()
  def get_assistant_list(client, room_id) do
    client.get("/wxaapi/broadcast/room/getassistantlist",
      query: [roomId: room_id, access_token: client.get_access_token()]
    )
  end

  @doc """
  添加主播副号 -
  [官方文档](#{@doc_link}#13){:target="_blank"}
  """
  @spec add_subanchor(WeChat.client(), room_id, User.username()) :: WeChat.response()
  def add_subanchor(client, room_id, username) do
    client.post(
      "/wxaapi/broadcast/room/addsubanchor",
      json_map(roomId: room_id, username: username),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  修改主播副号 -
  [官方文档](#{@doc_link}#14){:target="_blank"}
  """
  @spec modify_subanchor(WeChat.client(), room_id, User.username()) :: WeChat.response()
  def modify_subanchor(client, room_id, username) do
    client.post(
      "/wxaapi/broadcast/room/modifysubanchor",
      json_map(roomId: room_id, username: username),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  删除主播副号 -
  [官方文档](#{@doc_link}#15){:target="_blank"}
  """
  @spec delete_subanchor(WeChat.client(), room_id) :: WeChat.response()
  def delete_subanchor(client, room_id) do
    client.post(
      "/wxaapi/broadcast/room/deletesubanchor",
      json_map(roomId: room_id),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  获取主播副号 -
  [官方文档](#{@doc_link}#16){:target="_blank"}
  """
  @spec get_subanchor(WeChat.client(), room_id) :: WeChat.response()
  def get_subanchor(client, room_id) do
    client.get("/wxaapi/broadcast/room/getsubanchor",
      query: [roomId: room_id, access_token: client.get_access_token()]
    )
  end

  @doc """
  开启/关闭直播间官方收录 -
  [官方文档](#{@doc_link}#17){:target="_blank"}
  """
  @spec update_feed_public(WeChat.client(), room_id, is_feeds_public) :: WeChat.response()
  def update_feed_public(client, room_id, is_feeds_public) do
    is_feeds_public =
      if is_integer(is_feeds_public) do
        is_feeds_public
      else
        (is_feeds_public && 1) || 0
      end

    client.post(
      "/wxaapi/broadcast/room/updatefeedpublic",
      json_map(roomId: room_id, isFeedsPublic: is_feeds_public),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  开启/关闭回放功能 -
  [官方文档](#{@doc_link}#18){:target="_blank"}
  """
  @spec update_replay(WeChat.client(), room_id, is_close_replay) :: WeChat.response()
  def update_replay(client, room_id, is_close_replay) do
    is_close_replay =
      if is_integer(is_close_replay) do
        is_close_replay
      else
        (is_close_replay && 1) || 0
      end

    client.post(
      "/wxaapi/broadcast/room/updatereplay",
      json_map(roomId: room_id, closeReplay: is_close_replay),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  开启/关闭客服功能 -
  [官方文档](#{@doc_link}#19){:target="_blank"}
  """
  @spec update_kf(WeChat.client(), room_id, is_close_kf) :: WeChat.response()
  def update_kf(client, room_id, is_close_kf) do
    is_close_kf =
      if is_integer(is_close_kf) do
        is_close_kf
      else
        (is_close_kf && 1) || 0
      end

    client.post(
      "/wxaapi/broadcast/room/updatekf",
      json_map(roomId: room_id, closeKf: is_close_kf),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  开启/关闭直播间全局禁言 -
  [官方文档](#{@doc_link}#20){:target="_blank"}
  """
  @spec update_comment(WeChat.client(), room_id, is_ban_comment) :: WeChat.response()
  def update_comment(client, room_id, is_ban_comment) do
    is_ban_comment =
      if is_integer(is_ban_comment) do
        is_ban_comment
      else
        (is_ban_comment && 1) || 0
      end

    client.post(
      "/wxaapi/broadcast/room/updatecomment",
      json_map(roomId: room_id, banComment: is_ban_comment),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  上下架直播间商品 -
  [官方文档](#{@doc_link}#21){:target="_blank"}
  """
  @spec goods_onsale(WeChat.client(), room_id, Goods.goods_id(), is_on_sale) :: WeChat.response()
  def goods_onsale(client, room_id, goods_id, is_on_sale) do
    is_on_sale =
      if is_integer(is_on_sale) do
        is_on_sale
      else
        (is_on_sale && 1) || 0
      end

    client.post(
      "/wxaapi/broadcast/goods/onsale",
      json_map(roomId: room_id, goodsId: goods_id, onSale: is_on_sale),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  删除直播间商品 -
  [官方文档](#{@doc_link}#22){:target="_blank"}
  """
  @spec goods_delete(WeChat.client(), room_id, Goods.goods_id()) :: WeChat.response()
  def goods_delete(client, room_id, goods_id) do
    client.post(
      "/wxaapi/broadcast/goods/deleteInRoom",
      json_map(roomId: room_id, goodsId: goods_id),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  推送商品 -
  [官方文档](#{@doc_link}#23){:target="_blank"}
  """
  @spec goods_push(WeChat.client(), room_id, Goods.goods_id()) :: WeChat.response()
  def goods_push(client, room_id, goods_id) do
    client.post(
      "/wxaapi/broadcast/goods/push",
      json_map(roomId: room_id, goodsId: goods_id),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  直播间商品排序 -
  [官方文档](#{@doc_link}#24){:target="_blank"}
  """
  @spec goods_sort(WeChat.client(), room_id, Goods.goods_ids()) :: WeChat.response()
  def goods_sort(client, room_id, goods_ids) do
    goods = Enum.map(goods_ids, &json_map(goodsId: &1))

    client.post(
      "/wxaapi/broadcast/goods/sort",
      json_map(roomId: room_id, goods: goods),
      query: [access_token: client.get_access_token()]
    )
  end

  @doc """
  下载商品讲解视频 -
  [官方文档](#{@doc_link}#25){:target="_blank"}
  """
  @spec goods_get_video(WeChat.client(), room_id, Goods.goods_id()) :: WeChat.response()
  def goods_get_video(client, room_id, goods_id) do
    client.post(
      "/wxaapi/broadcast/goods/getVideo",
      json_map(roomId: room_id, goodsId: goods_id),
      query: [access_token: client.get_access_token()]
    )
  end
end