package com.xyoye.dandanplay.mvp.impl;

import android.arch.lifecycle.LifecycleOwner;
import android.database.Cursor;
import android.os.Bundle;

import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.xyoye.dandanplay.base.BaseMvpPresenterImpl;
import com.xyoye.dandanplay.bean.AnimeTypeBean;
import com.xyoye.dandanplay.bean.MagnetBean;
import com.xyoye.dandanplay.bean.SearchHistoryBean;
import com.xyoye.dandanplay.bean.SubGroupBean;
import com.xyoye.dandanplay.mvp.presenter.SearchPresenter;
import com.xyoye.dandanplay.mvp.view.SearchView;
import com.xyoye.dandanplay.utils.AppConfig;
import com.xyoye.dandanplay.utils.Constants;
import com.xyoye.dandanplay.utils.database.DataBaseManager;
import com.xyoye.dandanplay.utils.database.callback.QueryAsyncResultCallback;
import com.xyoye.dandanplay.utils.net.CommOtherDataObserver;
import com.xyoye.dandanplay.utils.net.NetworkConsumer;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import okhttp3.ResponseBody;

/**
 * Created by xyoye on 2019/1/8.
 */

public class SearchPresenterImpl extends BaseMvpPresenterImpl<SearchView> implements SearchPresenter {

    public SearchPresenterImpl(SearchView view, LifecycleOwner lifecycleOwner) {
        super(view, lifecycleOwner);
    }

    @Override
    public void init() {

    }

    @Override
    public void process(Bundle savedInstanceState) {

    }

    @Override
    public void resume() {

    }

    @Override
    public void pause() {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void getSearchHistory(boolean doSearch) {
        DataBaseManager.getInstance()
                .selectTable("search_history")
                .query()
                .setOrderByColumnDesc("time")
                .postExecute(new QueryAsyncResultCallback<List<SearchHistoryBean>>(getLifecycle()) {
                    @Override
                    public List<SearchHistoryBean> onQuery(Cursor cursor) {
                        if (cursor == null) return new ArrayList<>();
                        List<SearchHistoryBean> historyBeanList = new ArrayList<>();
                        while (cursor.moveToNext()) {
                            int _id = cursor.getInt(0);
                            String text = cursor.getString(1);
                            long time = cursor.getLong(2);
                            historyBeanList.add(new SearchHistoryBean(_id, text, time));
                        }
                        //添加清除所有搜索记录,id = -1、text = ""作为标志
                        if (historyBeanList.size() > 0)
                            historyBeanList.add(new SearchHistoryBean(-1, "", -1));

                        return historyBeanList;
                    }

                    @Override
                    public void onResult(List<SearchHistoryBean> result) {
                        getView().refreshHistory(result, doSearch);
                    }
                });
    }

    @Override
    public void queryTypeList() {
        DataBaseManager.getInstance()
                .selectTable("anime_type")
                .query()
                .postExecute(new QueryAsyncResultCallback<List<AnimeTypeBean.TypesBean>>(getLifecycle()) {

                    @Override
                    public List<AnimeTypeBean.TypesBean> onQuery(Cursor cursor) {
                        if (cursor == null)
                            return new ArrayList<>();
                        List<AnimeTypeBean.TypesBean> typeList = new ArrayList<>();
                        while (cursor.moveToNext()) {
                            int typeId = cursor.getInt(1);
                            String typeName = cursor.getString(2);
                            typeList.add(new AnimeTypeBean.TypesBean(typeId, typeName));
                        }
                        return typeList;
                    }

                    @Override
                    public void onResult(List<AnimeTypeBean.TypesBean> result) {
                        getView().showAnimeTypeDialog(result);
                    }
                });

    }

    @Override
    public void querySubGroupList() {
        DataBaseManager.getInstance()
                .selectTable("subgroup")
                .query()
                .postExecute(new QueryAsyncResultCallback<List<SubGroupBean.SubgroupsBean>>(getLifecycle()) {
                    @Override
                    public List<SubGroupBean.SubgroupsBean> onQuery(Cursor cursor) {
                        if (cursor == null)
                            return new ArrayList<>();
                        List<SubGroupBean.SubgroupsBean> subgroupList = new ArrayList<>();
                        while (cursor.moveToNext()) {
                            int subgroupId = cursor.getInt(1);
                            String subgroupName = cursor.getString(2);
                            subgroupList.add(new SubGroupBean.SubgroupsBean(subgroupId, subgroupName));
                        }
                        return subgroupList;
                    }

                    @Override
                    public void onResult(List<SubGroupBean.SubgroupsBean> result) {
                        getView().showSubGroupDialog(result);
                    }
                });

    }

    @Override
    public void addHistory(String text) {
        DataBaseManager.getInstance()
                .selectTable("search_history")
                .insert()
                .param("text", text)
                .param("time", System.currentTimeMillis())
                .postExecute();
    }

    @Override
    public void updateHistory(int _id) {
        DataBaseManager.getInstance()
                .selectTable("search_history")
                .update()
                .param("time", System.currentTimeMillis())
                .where("_id", _id + "")
                .postExecute();
    }

    @Override
    public void deleteHistory(int _id) {
        DataBaseManager.getInstance()
                .selectTable("search_history")
                .delete()
                .where("_id", _id + "")
                .postExecute();
    }

    @Override
    public void deleteAllHistory() {
        DataBaseManager.getInstance()
                .selectTable("search_history")
                .delete()
                .postExecute();
    }

    @Override
    public void search(String text, int type, int subgroup) {
        MagnetBean.searchMagnet(text, type, subgroup, new CommOtherDataObserver<MagnetBean>(getLifecycle()) {
            @Override
            public void onSuccess(MagnetBean magnetBean) {
                if (magnetBean != null && magnetBean.getResources() != null) {
                    getView().refreshSearch(magnetBean.getResources());
                }
            }

            @Override
            public void onError(int errorCode, String message) {
                LogUtils.e(message);
                ToastUtils.showShort(message);
            }
        }, new NetworkConsumer());
    }

    @Override
    public void searchLocalTorrent(String magnet) {
        String torrentPath = isTorrentExist(magnet);
        if (!StringUtils.isEmpty(torrentPath)) {
            getView().downloadExisted(torrentPath, magnet);
        } else {
            downloadTorrent(magnet);
        }
    }

    @Override
    public void downloadTorrent(String magnet) {
        getView().showDownloadTorrentLoading();
        MagnetBean.downloadTorrent(magnet, new CommOtherDataObserver<ResponseBody>() {
            @Override
            public void onSuccess(ResponseBody responseBody) {
                String downloadPath = getView().getDownloadFolder();
                downloadPath += Constants.DefaultConfig.torrentFolder;
                downloadPath += "/" + magnet.substring(20) + ".torrent";
                FileIOUtils.writeFileFromIS(downloadPath, responseBody.byteStream());
                getView().dismissDownloadTorrentLoading();
                getView().downloadTorrentOver(downloadPath, magnet);
            }

            @Override
            public void onError(int errorCode, String message) {
                getView().dismissDownloadTorrentLoading();
                LogUtils.e(message);
                ToastUtils.showShort("下载种子文件失败");
            }
        }, new NetworkConsumer());
    }

    //判断该种子是否已存在
    private String isTorrentExist(String magnet) {
        String downloadPath = getView().getDownloadFolder();
        downloadPath += Constants.DefaultConfig.torrentFolder;
        downloadPath += "/" + magnet.substring(20) + ".torrent";
        File file = new File(downloadPath);
        if (file.exists()) {
            return downloadPath;
        } else {
            downloadPath = AppConfig.getInstance().getDownloadFolder();
            downloadPath += Constants.DefaultConfig.torrentFolder;
            downloadPath += "/" + magnet.substring(20) + ".torrent";
            if (file.exists())
                return downloadPath;
            else
                return "";
        }
    }
}