package com.halomobi.sdk;

import static com.halomobi.common.ConstantPool.A_SDK;
import static com.halomobi.common.ConstantPool.TrackerType.CLICK;
import static com.halomobi.common.ConstantPool.TrackerType.DEEP_LINK_OPEN;
import static com.halomobi.common.ConstantPool.TrackerType.DOWNLOADED;
import static com.halomobi.common.ConstantPool.TrackerType.INSTALLED;
import static com.halomobi.common.ConstantPool.TrackerType.INSTALL_START;
import static com.halomobi.common.ConstantPool.TrackerType.OPEN;
import static com.halomobi.common.ConstantPool.TrackerType.S_DOWNLOAD;
import static com.halomobi.utils.LogUtils.formatDate;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.halomobi.common.ConstantPool;
import com.halomobi.download.DownLoadManager;
import com.halomobi.download.bean.DownloadItem;
import com.halomobi.download.listener.DownloadStateListener;
import com.halomobi.hlinterface.IAdControl;
import com.halomobi.network.listeners.AdStateChangListener;
import com.halomobi.network.listeners.ClickAdStateChangListener;
import com.halomobi.network.listeners.TrackerTaskListener;
import com.halomobi.network.report.track.ReportTrackerManager;
import com.halomobi.network.request.ad.RequestAdManager;
import com.halomobi.network.request.ad.bean.Ad;
import com.halomobi.network.request.ad.bean.AdParameter;
import com.halomobi.sdk.R;
import com.halomobi.sdk.WebViewActivity;
import com.halomobi.utils.KeyUtil;
import com.halomobi.utils.LogUtils;
import com.halomobi.utils.NetworkUtils;
import com.halomobi.utils.SDKInfo;
import com.halomobi.utils.SystemUtils;
import com.halomobi.utils.Utils;
import com.halomobi.view.HlTipsDialog;
import com.halomobi.view.imageloader.ImageLoader;

import java.net.URISyntaxException;
import java.util.Arrays;

public class AdController implements IAdControl {

    private boolean isBannerLoop;
    private Context mContext;

    private TrackerTaskListener trackerListener;

    private ClickAdStateChangListener clickListener;

    public AdController(Context context) {
        this.mContext = context;
    }

    @Override
    public synchronized void setTrackerTaskListener(TrackerTaskListener trackerListener) {
        this.trackerListener = trackerListener;
    }

    @Override
    public void setClickAdListener(ClickAdStateChangListener listener) {
        clickListener = listener;
    }

    /**
     * 请求广告
     */
    @Override
    public synchronized final void requestAd(AdParameter adParameter, AdStateChangListener adStateListener) {
        RequestAdManager.getInstance().requestAd(adParameter, adStateListener);
    }



    /**
     * 关闭广告
     */
    @Override
    public void closeAd(Ad adInfo) {
        reportTracker(adInfo, ConstantPool.TrackerType.CLOSE);//发送关闭广告监播
    }

    /**
     * 点击广告
     *
     * @param info 广告对象
     */
    @Override
    public void clickAd(final Ad info) {
        clickAd(info, null);
    }

    @Override
    public void clickAd(Ad ad, DownloadStateListener listener) {
        if (TextUtils.isEmpty(ad.dplk) && TextUtils.isEmpty(ad.clkurl) && TextUtils.isEmpty(ad.landing_url)) {
            return;
        }
        String deepLink = ad.dplk;
        if (!TextUtils.isEmpty(deepLink)) {
            if (gotoQuickApp(ad, deepLink, true)) return;
        }
        if (TextUtils.isEmpty(ad.clkurl)) {
            ad.clkurl = ad.landing_url;
        }
//        ad.clkurl = "https://www.zhihu.com/tardis/zm/art/403078546";
        switch (ad.interaction_type) {
            case 1://网页跳转
//                ad.getTencentUrl();
                openWebPage(ad, ad.clkurl);
                break;
            case 2://下载
//                if (checkInstalled(ad.bundle.trim())) {
//                    //已经安装过,调起应用,不继续执行下载任务
//                    break;
//                }
//                openWebPage(ad, ad.landing_url);
                if (!Utils.areNotificationsEnabled()) {
                    showSettingDialog();
                }
                //启动下载任务
                executeDownload(ad, listener);
                break;
            case 3://跳转系统浏览器
                reportTracker(ad, CLICK);//发送点击监播
                SystemUtils.loopWeb(ad.clkurl);//跳转系统浏览器
                break;
            case 4:         //跳转快应用
                gotoQuickApp(ad, ad.clkurl, false);
                break;
            default:
                break;
        }
    }

    private void showSettingDialog() {
        boolean isFirstNotification = Utils.getSp().getBoolean("isFirstNotification", false);
        if (isFirstNotification) {
            return;
        }
        HlTipsDialog tipsDialog = new HlTipsDialog(mContext, R.style.hl_dialog);
        tipsDialog.setTipTitle("是否开启通知栏消息?");
        tipsDialog.setEnsureStr("确定");
        tipsDialog.setCancelStr("取消");
        tipsDialog.setonDialogClickListener(new HlTipsDialog.OnDialogClickListener() {
            @Override
            public void onCancelClick() {
                Utils.getSp().edit().putBoolean("isFirstNotification", true).apply();
            }

            @Override
            public void onEnsureClick() {
                Utils.getSp().edit().putBoolean("isFirstNotification", true).apply();
                Utils.gotoSet();
            }
        });
        tipsDialog.show();
    }

    private boolean gotoQuickApp(Ad ad, String deepLink, boolean reportDeepLinkOpen) {
        try {
            Intent deepLinkIntent = Intent.parseUri(deepLink, Intent.URI_INTENT_SCHEME);
            deepLinkIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(deepLinkIntent, PackageManager.MATCH_DEFAULT_ONLY);
            if (resolveInfo != null) {
                mContext.startActivity(deepLinkIntent);
                LogUtils.d("DeepLink 跳转成功   :  " + deepLink);
//                reportTracker(ad, ConstantPool.TrackerType.CLICK);//发送点击监播
                if (clickListener != null) {
                    clickListener.onClickAdStateChang(ClickAdStateChangListener.STATE_WEB_LOAD_DEEPLINK);
                }
                if (reportDeepLinkOpen) {
                    reportTracker(ad, CLICK);
                    reportTracker(ad, DEEP_LINK_OPEN);//发送deepLink激活监播
                }
                return true;
            } else {
                LogUtils.w("DeepLink NotFound  :  " + deepLink);
            }

        } catch (ActivityNotFoundException e) {
            LogUtils.w("DeepLink NotFound  :  " + deepLink);
        } catch (URISyntaxException e) {
            e.printStackTrace();
            LogUtils.w("DeepLink NotFound  :  " + deepLink);
        }
        return false;
    }


    /**
     * 点击广告后使用WebView打开页面
     *
     * @param info      广告对象
     * @param click_url 跳转地址
     */
    private void openWebPage(final Ad info, String click_url) {
        ReportTrackerManager.getInstance().reportTrack(info.getTracks(CLICK));//点击监播
        Intent intent = new Intent(mContext, WebViewActivity.class);
        intent.putExtra("urlStr", click_url);
        mContext.startActivity(intent);
    }

    /**
     * 下载类广告点击后启动下载任务
     *
     * @param info 广告对象
     */
    private void executeDownload(final Ad info, final DownloadStateListener listener) {

        if (NetworkUtils.getNetworkType() == NetworkUtils.NET_WIFI) {
            //如果是wifi 或者 不需要提示二次确认
            downLoadApp(info, listener);
            return;
        }

        //非Wifi且需要提示用户
        AlertDialog alertDialog = new Builder(mContext).setTitle("提示")
                .setMessage("确认使用移动网络进行下载?")
                .setNegativeButton("取消", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CANCEL);
                    }
                }).setPositiveButton("确认", new OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CONFIRM);
                        downLoadApp(info, listener);//启动下载
                    }

                }).setOnCancelListener(new OnCancelListener() {

                    @Override
                    public void onCancel(DialogInterface dialog) {
                        onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_CANCEL);
                    }
                }).create();

        if (alertDialog == null) {
            return;
        }

        if (!(mContext instanceof Activity)) {
            Window window = alertDialog.getWindow();
            if (window != null) {
                window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            }
        }
        if (!alertDialog.isShowing() && !((Activity)mContext).isFinishing()) {
            alertDialog.show();
        }

        onClickAdStateChang(ClickAdStateChangListener.STATE_OPTION_DIALOG_OPEN);
    }

    /**
     * 检测是否已经安装了该应用,如果已安装,打开该应用
     *
     * @param packageName 包名
     * @return true 已安装  false 未安装
     */
    private boolean checkInstalled(String packageName) {
        if (!DownLoadManager.getInstance(mContext).isAppInstalled(packageName)) {//检测是否已经安装
            //未安装
            return false;
        }

        //尝试调起该应用
        if (DownLoadManager.getInstance(mContext).openApp(packageName, -1)) {
            LogUtils.i("打开 已安装 app--->" + packageName);
        }

        return true;
    }

    /**
     * 创建下载任务
     *
     * @param adInfo 广告对象
     * @return 下载任务对象
     */
    private DownloadItem createDownloadItem(final Ad adInfo, final DownloadStateListener listener) {
        DownloadItem item = new DownloadItem();
        item.setName(KeyUtil.getMD5(adInfo.clkurl));//设置下载项目名称
        item.setDownLoadUrl(adInfo.clkurl.trim());//下载地址
        item.setDeepLink(adInfo.dplk);
        item.setDownloadStartTrackerTracker(Arrays.toString(adInfo.getTracks(S_DOWNLOAD).toArray()));
        item.setDownloadedTracker(Arrays.toString(adInfo.getTracks(DOWNLOADED).toArray()));
        item.setInstallStartTracker(Arrays.toString(adInfo.getTracks(INSTALL_START).toArray()));
        item.setInstalledTracker(Arrays.toString(adInfo.getTracks(INSTALLED).toArray()));
        item.setOpenTracker(Arrays.toString(adInfo.getTracks(OPEN).toArray()));
        if (!TextUtils.isEmpty(adInfo.dplk)) { //deepLink 不为空,deepLink监播才有值
            item.setDeepLinkTracker(Arrays.toString(adInfo.getTracks(DEEP_LINK_OPEN).toArray()));
        }
        if (adInfo.ctop == 4) {
            //替换点击位置
            item.setClickTracker(Arrays.toString(adInfo.getTracks(CLICK).toArray()));
        }
        item.setListener(new DownloadStateListener() {

            @Override
            public void onDownloadError(DownloadItem item, int errorCode, String errorMsg) {
                onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_FAILED);
            }

            @Override
            public void onDownloadStart(DownloadItem item, Ad adInfo) {
                onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_START);
                if (listener != null) {
                    listener.onDownloadStart(item, adInfo);
                }
            }

            @Override
            public void onDownloaded(DownloadItem item, Ad adInfo) {
                onClickAdStateChang(ClickAdStateChangListener.STATE_APP_DOWNLOAD_OK);

                if (listener != null) {
                    listener.onDownloaded(item, adInfo);
                }
            }

            @Override
            public void onInstalled(DownloadItem item, Ad adInfo) {
                onClickAdStateChang(ClickAdStateChangListener.STATE_APP_INSTALLED);

                if (listener != null) {
                    listener.onInstalled(item, adInfo);
                }
            }

            @Override
            public void onOpened(DownloadItem item, Ad adInfo) {
                onClickAdStateChang(ClickAdStateChangListener.STATE_APP_OPEN);
            }

        });

        return item;
    }

    /**
     * 回调点击状态
     *
     * @param clickAdState 当前状态
     */
    private void onClickAdStateChang(int clickAdState) {
        if (clickListener == null) {
            return;
        }
        clickListener.onClickAdStateChang(clickAdState);
    }

    /**
     * 准备开始下载任务
     *
     * @param info 广告对象
     */
    private void downLoadApp(final Ad info, final DownloadStateListener listener) {
        reportTracker(info, CLICK);
        DownLoadManager.getInstance(mContext).downloadWithShow(createDownloadItem(info, listener), info);
    }

    /**
     * 发送监播
     *
     * @param info 广告对象
     * @param type 监播类型
     */

    @Override
    public synchronized void reportTracker(Ad info, int type) {
        if (info == null) {
            return;
        }

        switch (type) {
            case ConstantPool.TrackerType.DISPLAY:
                //banner轮播不曝光
                if (info.ad_type == ConstantPool.AdType.BANNER.getType() && isBannerLoop) {
                    if (trackerListener != null) trackerListener.onTrackersReturn();
                    return;
                }
                isBannerLoop = true;
                if (info.isSubDisTrk) {
                    return;
                }
                info.isSubDisTrk = true;
                info.show_time = System.currentTimeMillis();
                LogUtils.i("广告展示:" + formatDate(System.currentTimeMillis()));

                break;
            case CLICK:
                if (info.isSubmitClkTrk) {
                    return;
                }
                info.isSubmitClkTrk = true;
                info.click_time = System.currentTimeMillis();
                LogUtils.i("广告点击:" + formatDate(System.currentTimeMillis()));
                break;
            case DEEP_LINK_OPEN:
                if (info.isSubmitDeepLinkTrk) {
                    return;
                }
                info.isSubmitDeepLinkTrk = true;
                LogUtils.i("广告DeepLink打开:" + formatDate(System.currentTimeMillis()));
                break;
            default:
                break;
        }

        ReportTrackerManager.getInstance().reportTrack(type, trackerListener, info.getTracks(type));
    }

    @Override
    public void loadImage(View imageView, String url) {
        ImageLoader.load(imageView, url);
    }

}