package com.reactnative.drwine;

import android.util.Log;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.gson.Gson;
import com.reactnative.drwine.Utils.ToastHelp;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.PlatformDb;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;
import cn.sharesdk.wechat.moments.WechatMoments;

/**
 * Created by YinMenglong on 2017/5/2.
 */

public class DrwineAuthOrShare extends ReactContextBaseJavaModule {

    private static final int TYPE_QQ = 0;
    private static final int TYPE_WECHAT = 1;
    private static final int TYPE_WECHATMOMENTS = 2;
    private static final int TYPE_SINA = 3;

    public DrwineAuthOrShare(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "ThirdOAuthModule";
    }

    private int getChannelType(String key) {

        Map<String, Integer> map = new HashMap<>();
        map.put(QQ.NAME, TYPE_QQ);
        map.put(Wechat.NAME, TYPE_WECHAT);
        map.put(WechatMoments.NAME, TYPE_WECHATMOMENTS);
        map.put(SinaWeibo.NAME, TYPE_SINA);

        return map.get(key);
    }

    /**
     * 微信 好友  和  朋友圈 分享
     *
     * @param title
     * @param content
     * @param shareUrl
     * @param type     0 好有 1朋友圈
     * @param imageUrl
     */
    @ReactMethod
    public void sendWxContentWithTitle(String title, String content, String shareUrl, int type, String imageUrl) {
        String channelName = Wechat.NAME;
        if (type == 1) {
            channelName = WechatMoments.NAME;
        }
        this.onShare(title, content, shareUrl, imageUrl, channelName);
    }

    /**
     * 微博分享
     *
     * @param title
     * @param content
     * @param shareUrl
     * @param imageUrl
     */
    @ReactMethod
    public void sendSinaWbContentWithTitle(String title, String content, String shareUrl, String imageUrl) {
        this.onShare(title, content, shareUrl, imageUrl, SinaWeibo.NAME);
    }

    private void onShare(String title, String content, String shareUrl, String imageUrl, String channelName) {


        Log.d("SHARE", "title:" + title + ",content:" + content + ",shareUrl:" + shareUrl + ",imageUrl:" + imageUrl);

        Platform.ShareParams sp = new Platform.ShareParams();

        sp.setImageUrl(imageUrl);

        switch (getChannelType(channelName)) {
            case TYPE_WECHAT:
            case TYPE_WECHATMOMENTS:
                sp.setTitle(title);
                sp.setText(content);
                sp.setUrl(shareUrl);
                sp.setShareType(Platform.SHARE_WEBPAGE);
                break;
            default:
                sp.setText(content + shareUrl);
                break;
        }

        Platform platform = ShareSDK.getPlatform(channelName);

        platform.setPlatformActionListener(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
                ToastHelp.alert(getReactApplicationContext(), "分享成功");
            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {
                ToastHelp.alert(getReactApplicationContext(), "分享错误");
                throwable.printStackTrace();
            }

            @Override
            public void onCancel(Platform platform, int i) {
                ToastHelp.alert(getReactApplicationContext(), "取消分享");
            }
        });

        platform.share(sp);
    }

    @ReactMethod
    public void getQQAppIsInstall(Callback callback) {
        callback.invoke("YES");
    }

    @ReactMethod
    public void getWXAppIsInstall(Callback callback) {
        callback.invoke("YES");
    }

    @ReactMethod
    public void getSinaWbAppIsInstall(Callback callback) {
        callback.invoke("YES");
    }

    @ReactMethod
    public void goToQQOAuth(Callback callback) {
        authLogin(QQ.NAME, callback);
    }

    @ReactMethod
    public void goToWeiXinOAuth(Callback callback) {
        authLogin(Wechat.NAME, callback);
    }

    @ReactMethod
    public void goToSinaWBOAuth(Callback callback) {
        authLogin(SinaWeibo.NAME, callback);
    }

    private void authLogin(final String channelName, final Callback callback) {
        Platform platform = ShareSDK.getPlatform(channelName);
        if (platform.isAuthValid()) {
            platform.removeAccount(true);
        }
        platform.SSOSetting(false);
        platform.setPlatformActionListener(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {


                PlatformDb platDB = platform.getDb();

//                Iterator ite = hashMap.entrySet().iterator();
//                while (ite.hasNext()) {
//                    Map.Entry entry = (Map.Entry) ite.next();
//                    Object key = entry.getKey();
//                    Object value = entry.getValue();
//                    Log.d("SHARESDK", key + "： " + value);
//                }

                switch (getChannelType(channelName)) {
                    case TYPE_QQ:
                        QQ(platDB, hashMap, callback);
                        break;
                    case TYPE_WECHAT:
                        WEICHAT(platDB, hashMap, callback);
                        break;
                    default:
                        SINAWB(platDB, hashMap, callback);
                        break;
                }
            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {
                ToastHelp.alert(getReactApplicationContext(), "授权失败");
                Log.d("SHARESDK", "授权失败");
                throwable.printStackTrace();
            }

            @Override
            public void onCancel(Platform platform, int i) {
                ToastHelp.alert(getReactApplicationContext(), "取消授权");
            }
        });
        platform.showUser(null);//授权并获取用户信息
    }

    private void QQ(PlatformDb platDB, HashMap<String, Object> hashMap, Callback callback) {

        AccountQQCommand qq = new AccountQQCommand();
        qq.setOpenid(platDB.getUserId());
        qq.setNickname(platDB.getUserName());
        qq.setGender(hashMap.get("gender").toString());
        qq.setFigureurl(hashMap.get("figureurl").toString());
        qq.setFigureurl_1(hashMap.get("figureurl_1").toString());
        qq.setFigureurl_2(hashMap.get("figureurl_2").toString());
        qq.setFigureurl_qq_1(hashMap.get("figureurl_qq_1").toString());
        qq.setFigureurl_qq_2(hashMap.get("figureurl_qq_2").toString());
        callback.invoke(new Gson().toJson(qq));

    }

    private void WEICHAT(PlatformDb platDB, HashMap<String, Object> hashMap, Callback callback) {
        AccountWxCommand wx = new AccountWxCommand();
        wx.setOpenid(hashMap.get("openid").toString());
        wx.setNickname(hashMap.get("nickname").toString());
        wx.setSex((Integer) hashMap.get("sex"));
        wx.setProvince(hashMap.get("province").toString());
        wx.setCity(hashMap.get("city").toString());
        wx.setCountry(hashMap.get("country").toString());
        wx.setHeadimgurl(hashMap.get("headimgurl").toString());
        wx.setUnionid(hashMap.get("unionid").toString());
        callback.invoke(new Gson().toJson(wx));
    }

    private void SINAWB(PlatformDb platDB, HashMap<String, Object> hashMap, Callback callback) {
//        AccountWbCommand wb = new AccountWbCommand();
//        wb.setId((Long) hashMap.get("id"));
//        wb.setIdstr(hashMap.get("idstr").toString());
//        wb.setScreen_name(hashMap.get("screen_name").toString());
//        wb.setName(hashMap.get("name").toString());
//        wb.setProvince((Long) hashMap.get("province"));
//        wb.setCity((Long) hashMap.get("city"));
//        wb.setLocation(hashMap.get("location").toString());
//        wb.setProfile_image_url(hashMap.get("profile_image_url").toString());
//        wb.setProfile_url(hashMap.get("profile_url").toString());
//        wb.setDomain(hashMap.get("domain").toString());
//        wb.setWeihao(hashMap.get("weihao").toString());
//        wb.setGender(hashMap.get("gender").toString());
//        wb.setRemark(hashMap.get("remark").toString());
//        wb.setAvatar_large(hashMap.get("avatar_large").toString());
//        wb.setAvatar_hd(hashMap.get("avatar_hd").toString());
        callback.invoke(new Gson().toJson(hashMap));
    }

}
