package cn.tee3.avd;

import android.os.Message;

/**
 * 直播观众接口类
 *
 * 直播观众接口定义了直播观众对象创建、直播观看和连麦操作。
 */
public class LivecastViewer extends Livecast {
    private static final String TAG = "LivecastViewer";
    /**
     * 直播观众回调接口类
     *
     * 直播观众回调接口定义了直播观众的rtmp播放和对接切换等相关通知。
     */
    public static interface Listener {
        /// 异步返回
        /** 连麦操作异步返回
         *
         * @param[in] result 错误代码。
         * @sa publish
         */
        public void onDialogueResult(int result);
        /// 通知
        /** 直播RTMP播放状态通知
         *
         * @param[in] url 直播rtmp连接。
         */
        public void onRtmpPlay(String url);
        /** 直播对讲状态通知
         */
        public void onRtmpStop();
    }

    protected LivecastViewer(String roomId) {
        super(roomId, false);
    }
//    public static LivecastViewer obtain(String roomId) {
//        Tlog.d(TAG, "obtain, roomId:" + roomId);
//        Livecast room =  Livecast.obtain(roomId);
//        if (null == room) {
//            try {
//                room = new LivecastViewer(roomId);
//            }
//            catch (Exception e) {
//                return null;
//            }
//            synchronized (rooms) {
//                rooms.add(room);
//            }
//            Tlog.v(TAG, "obtain, created");
//        }
//        return (LivecastViewer)room;
//    }

    /** 设置观众房间回调接口
     * @param[in] listener 回调接口指针。
     * @return 返回错误代码。
     * @see Listener
     */
    public int setListener2(Listener listener) {
        Tlog.i(TAG, "setListener2, nativeListener:" + nativeListener + ",listener:" + listener);
        this.listener4cb2 = listener;
        return nativeviewersetListener2(this.nativeListener);
    }

    /** 设置直播房间主播Id
     *
     *@note 获取直播房间对象后需要设置，以便区分是主播房间还是观众加入的房间对象
     */
    public int setBroadcasterId(String broadcasterId) {
        Tlog.i(TAG, "setBroadcasterId, broadcasterId="+broadcasterId);
        return nativesetBroadcasterId(broadcasterId);
    }
    /** 进入直播房间观看
     * @param[in] playUrl 直播的播放地址。
     * @param[in] *render 本地预览render接口。
     * @return 返回错误代码。
     * @sa onWatchResult
     */
    public int watchRoom(String playUrl, VideoRenderer render) {
        Tlog.i(TAG, "watchRoom, playUrl="+playUrl+",render="+render);
        this.mPlayUrl = playUrl;
        this.mRender = render;
        return nativewatchRoom(playUrl, this.mRender.nativeRender());
    }
    // for detail viewer imp
    protected String mPlayUrl;
    protected VideoRenderer mRender;

    /** 与主播连麦对话
     *
     * @return 返回错误代码。
     * @sa onDialogueResult
     */
    public int dialogue() {
        Tlog.i(TAG, "dialogue, render="+mRender);
        int ret = nativedialogue();
        if (ErrorCode.AVD_OK == ret) {

        }
        return ret;
    }

    //
    @Override
    protected void dispose() {
        nativeviewersetListener2(0);
        listener4cb2 = null;
        super.dispose();
    }

    protected Listener listener4cb2 = null;
    @Override
    protected boolean initHandler() {
        super.initHandler();
        if (null != listenerHandler) {
            return true;
        }
        AVDEngine.runOnLoopThreadSync(new Runnable() {
            @Override
            public void run() {
                initHandler_main();
            }
        });
        return true;
    }
    private boolean initHandler_main() {
        this.listenerHandler = new ViewerListenerHandler();
        return true;
    }
    protected class ViewerListenerHandler extends ListenerHandler {
        public ViewerListenerHandler() {
            super();
        }
        public void handleMessage(Message msg) {
            Tlog.v(TAG, "handleMessage, msg:"+msg.toString());
            if (null == listener4cb) {
                super.handleMessage(msg);
                return;
            }
            switch (msg.what) {
                case msg_onDialogueResult:
                    listener4cb2.onDialogueResult(msg.arg1);
                    break;
                case msg_onRtmpPlay:
                    listener4cb2.onRtmpPlay((String) msg.obj);
                    break;
                case msg_onRtmpStop:
                    listener4cb2.onRtmpStop();
                    break;
            }
            super.handleMessage(msg);
        }
    }

}
