package com.zbm.dainty.ui;

import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import android.text.format.Formatter;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.zbm.dainty.adapter.DownloadRecordAdapter;
import com.zbm.dainty.R;
import com.zbm.dainty.bean.FileDownloadBean;
import com.zbm.dainty.task.DownloaderTask;
import com.zbm.dainty.util.DaintyDBHelper;
import com.zbm.dainty.util.DownloadHelper;
import com.zbm.dainty.util.FileUtil;
import com.zbm.dainty.util.MyUtil;
import com.zbm.dainty.widget.SwipeBackActivity;
import com.zbm.dainty.widget.TextProgressBar;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.TreeSet;

import butterknife.BindView;
import butterknife.ButterKnife;


/**
 * Created by zbm阿铭 on 2018/3/18.
 */

public class DownloadRecordActivity extends SwipeBackActivity {
    @BindView(R.id.download_record_bar_theme)
    View downloadRecordBarTheme;
    @BindView(R.id.download_record_back)
    Button downloadRecordBack;
    @BindView(R.id.download_record_list)
    ListView downloadRecordList;
    @BindView(R.id.download_record_storage_size_bar)
    View storageSizeBar;
    @BindView(R.id.storage_size_progress)
    TextProgressBar textProgressBar;
    @BindView(R.id.empty_download_record)
    TextView emptyRecord;
    @BindView(R.id.download_record_select_more_bar)
    View selectMoreBar;
    @BindView(R.id.download_record_confirm_delete)
    Button confirmDelete;
    @BindView(R.id.download_record_cancel_delete)
    Button cancelDelete;

    private DownloadRecordAdapter adapter;
    private List<FileDownloadBean> data = new ArrayList<>();
    private Set<Integer> selectedItemList = new TreeSet<>();
    private int selectedPosition;
    private PopupWindow deleteWindow;
    private Timer timer;
    private File[] files;    //下载目录内的文件
    private int downloadingCount = 0;  //正在下载的文件数
    private Map<String, FileDownloadBean> pauseList = new LinkedHashMap<>();   //暂停任务列表
    private List<String> pauseListRemoveLog = new ArrayList<>();   //记录从pauseList移除的文件下载地址
    //private boolean flag=false;   //删除标志

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //startService(new Intent(this, FileListenerService.class));
        setContentView(R.layout.activity_download_record);
        IntentFilter mFilter = new IntentFilter();
        mFilter.addAction("download_progress_refresh");
        LocalBroadcastManager.getInstance(this).registerReceiver(downloadStatus, mFilter);

        ButterKnife.bind(this);
        initData();
        initView();
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                showNetSpeed();
            }
        }, 0, 1000);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //stopService(new Intent(this,FileListenerService.class));
        LocalBroadcastManager.getInstance(this).unregisterReceiver(downloadStatus);
        if (timer != null) {
            timer.cancel();
        }
        for (FileDownloadBean bean : pauseList.values()) {
            DaintyDBHelper.getDaintyDBHelper(this).updateDownloadTable(bean.getDownloadUrl()
                    , bean.getFilePath(), bean.getFileName(), bean.getFileSize(), bean.getDownloadProgress(),
                    bean.getLastModified());
        }
        pauseList.clear();
        for (String url : pauseListRemoveLog) {
            DaintyDBHelper.getDaintyDBHelper(this).deleteTableItem(DaintyDBHelper.DTB_NAME,
                    "where downloadUrl='" + url + "'");
        }
        DaintyDBHelper.getDaintyDBHelper(this).removeMessage();
    }

    @SuppressWarnings("ConstantConditions")
    private void initView() {
        adapter = new DownloadRecordAdapter(this, data);
        downloadRecordList.setAdapter(adapter);
        final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        downloadRecordBarTheme.setBackgroundColor(Color.parseColor(preferences.getString("theme_color",
                "#474747")));

        downloadRecordBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        downloadRecordList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @SuppressLint("SetTextI18n")
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                if (adapter.isCanSelectMore()) {
                    CheckBox itemCheckBox = view.findViewById(R.id.download_record_delete_checkbox);
                    if (itemCheckBox.isChecked()) {
                        itemCheckBox.setChecked(false);

                    } else {
                        itemCheckBox.setChecked(true);
                    }
                } else {
                    final FileDownloadBean fileDownloadBean = data.get(position);
                    if (fileDownloadBean.isFinished()) {
                        Intent intent = FileUtil.getFileIntent(new File(data.get(position).getFilePath()));
                        intent.putExtra("file_path", data.get(position).getFilePath());
                        startActivity(intent);

                    } else {
                        final ImageView downloadStatus = view.findViewById(R.id.download_status);
                        final TextView downloadSpeed = view.findViewById(R.id.download_speed);

                        if (!fileDownloadBean.isDownloading()) {

                            if (DownloadHelper.downloadList.size() == DownloadHelper.downloadLimitCount) {
                                Toast.makeText(DownloadRecordActivity.this, "下载数达最大限制",
                                        Toast.LENGTH_SHORT).show();
                                return;
                            }

                            downloadStatus.setImageDrawable(getResources().getDrawable(R.drawable.stop_download));
                            downloadSpeed.setText(fileDownloadBean.getSpeed());
                            fileDownloadBean.setDownloading(true);
                            if (new File(fileDownloadBean.getFilePath()).exists())
                                fileDownloadBean.setDownloadProgress(pauseList.get(fileDownloadBean.getDownloadUrl()).getDownloadProgress());
                            else
                                fileDownloadBean.setDownloadProgress(0);
                            DownloaderTask downloaderTask = new DownloaderTask(DownloadRecordActivity.this,
                                    fileDownloadBean.getFileName(), new File(fileDownloadBean.getFilePath()),
                                    fileDownloadBean.getFileSize(), fileDownloadBean.getDownloadProgress());
                            downloaderTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, fileDownloadBean.getDownloadUrl());
                            DownloadHelper.downloadList.add(downloaderTask);
                            pauseListRemoveLog.add(fileDownloadBean.getDownloadUrl());
                            pauseList.remove(fileDownloadBean.getDownloadUrl());

                        } else {

                            fileDownloadBean.setDownloading(false);
                            downloadStatus.setImageDrawable(getResources().getDrawable(R.drawable.start_download));
                            downloadSpeed.setText("暂停");
                            DownloaderTask downloaderTask = DownloadHelper.getDownloadFile(fileDownloadBean.getFilePath());
                            if (downloaderTask == null) return;
                            Log.d("ewe", "task进度:" + downloaderTask.getProgress() + "bean进度:" + fileDownloadBean.getDownloadProgress());
                            fileDownloadBean.setDownloadUrl(downloaderTask.getDownloadUrl());
                            downloaderTask.setPause(true);
                            downloaderTask.cancel(true);
                            DownloadHelper.downloadList.remove(downloaderTask);
                            pauseList.put(fileDownloadBean.getDownloadUrl(), fileDownloadBean);
                            pauseListRemoveLog.remove(fileDownloadBean.getDownloadUrl());
                        }
                    }
                }

            }
        });
        downloadRecordList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                selectedPosition = position;
                if (!selectMoreBar.isShown()) {
                    int[] positions = new int[2];
                    view.getLocationOnScreen(positions);
                    deleteWindow.showAtLocation(view, Gravity.TOP | Gravity.END,
                            MyUtil.dip2px(DownloadRecordActivity.this, 20),
                            positions[1] + MyUtil.dip2px(DownloadRecordActivity.this, 60));
                }
                return true;
            }
        });
        adapter.setOnCheckChangedListener(new DownloadRecordAdapter.OnCheckChangedListener() {
            @Override
            public void onCheckChanged(int position, boolean checked) {
                if (checked) {
                    selectedItemList.add(position);
                } else {
                    selectedItemList.remove(position);
                }
            }
        });
        emptyRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MyUtil.createDialog(DownloadRecordActivity.this, "删除提示",
                        "清空后需要重新下载文件!", "确定"
                        , new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                DaintyDBHelper.getDaintyDBHelper(DownloadRecordActivity.this).deleteTableItem(DaintyDBHelper.DTB_NAME, null);
                                DownloadHelper.stopAllDownloads();
                                File savePath = new File("/storage/emulated/0/DaintyDownloads");
                                if (savePath.exists()) {
                                    for (File file : savePath.listFiles()) {
                                        file.delete();
                                    }
                                    initData();
                                }
                            }
                        }, null);
            }
        });
        @SuppressLint("InflateParams")
        View contentView = ((LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.history_item_delete_window, null);
        Button editButton = contentView.findViewById(R.id.editButton);
        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.setRestoreCheckBox(false);
                adapter.setCanSelectMore(true);
                adapter.notifyDataSetInvalidated();
                selectMoreBar.setVisibility(View.VISIBLE);
                storageSizeBar.setVisibility(View.INVISIBLE);
                deleteWindow.dismiss();
            }
        });

        Button deleteButton = contentView.findViewById(R.id.deleteButton1);
        deleteButton.setText("删除该文件");
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteWindow.dismiss();
                //flag=true;
                final FileDownloadBean selectedBean = data.get(selectedPosition);
                //检查要删除的文件是否是暂停下载的
                if (pauseList.containsKey(selectedBean.getDownloadUrl())) {
                    DaintyDBHelper.getDaintyDBHelper(DownloadRecordActivity.this).deleteTableItem(DaintyDBHelper.DTB_NAME,
                            "where downloadUrl='" + selectedBean.getDownloadUrl() + "'");
                    pauseList.remove(selectedBean.getDownloadUrl());
                    pauseListRemoveLog.add(selectedBean.getDownloadUrl());
                    new File(selectedBean.getFilePath()).delete();
                    data.remove(selectedPosition);
                    adapter.notifyDataSetChanged();
                    refreshStorageStatus();
                } else {
                    final DownloaderTask task = DownloadHelper.getDownloadFile(selectedBean.getFilePath());
                    Log.d("Record", "任务:" + task);
                    if (task != null) {
                        MyUtil.createDialog(DownloadRecordActivity.this,"删除提示","删除下载中的文件需要重新下载!","仍要删除",new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                task.cancel(true);
                                new File(selectedBean.getFilePath()).delete();
                                data.remove(selectedPosition);
                                adapter.notifyDataSetChanged();
                                refreshStorageStatus();
                                //flag=false;
                            }
                        },null);
                    } else {
                        new File(selectedBean.getFilePath()).delete();
                        data.remove(selectedPosition);
                        adapter.notifyDataSetChanged();
                        refreshStorageStatus();
                    }
                }
//                if (flag) {
//                    new File(selectedBean.getFilePath()).delete();
//                    data.remove(selectedPosition);
//                    adapter.notifyDataSetChanged();
//                    refreshStorageStatus();
//                }
            }
        });
        deleteWindow = new PopupWindow(contentView, MyUtil.dip2px(this, 120),
                ViewGroup.LayoutParams.WRAP_CONTENT);
        deleteWindow.setFocusable(true);
        deleteWindow.setOutsideTouchable(true);
        deleteWindow.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        confirmDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("rer", "选中:" + selectedItemList + "data size:" + data.size());
                for (int i : selectedItemList) {
                    FileDownloadBean selectedBean = data.get(i);
                    if (pauseList.containsKey(selectedBean.getDownloadUrl())) {
                        DaintyDBHelper.getDaintyDBHelper(DownloadRecordActivity.this).deleteTableItem(DaintyDBHelper.DTB_NAME,
                                "where downloadUrl='" + selectedBean.getDownloadUrl() + "'");
                        pauseList.remove(selectedBean.getDownloadUrl());
                        pauseListRemoveLog.add(selectedBean.getDownloadUrl());

                    }
                    new File(selectedBean.getFilePath()).delete();
                    DownloaderTask task = DownloadHelper.getDownloadFile(selectedBean.getFilePath());
                    if (task != null) {
                        task.cancel(true);
                    }
                    pauseListRemoveLog.add(selectedBean.getDownloadUrl());
                    pauseList.remove(selectedBean.getDownloadUrl());
                }
                int removeNum = -1;
                for (int i : selectedItemList) {
                    data.remove((i - (removeNum + 1)));
                    removeNum++;
                }
                adapter.setRestoreCheckBox(true);
                adapter.setCanSelectMore(false);
                adapter.notifyDataSetChanged();
                selectMoreBar.setVisibility(View.INVISIBLE);
                storageSizeBar.setVisibility(View.VISIBLE);
                selectedItemList.clear();
                refreshStorageStatus();
            }
        });
        cancelDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.setCanSelectMore(false);
                adapter.setRestoreCheckBox(true);
                adapter.notifyDataSetInvalidated();
                selectMoreBar.setVisibility(View.INVISIBLE);
                storageSizeBar.setVisibility(View.VISIBLE);
            }
        });
    }

    private void initData() {
        downloadingCount = DownloadHelper.downloadList.size();
        data.clear();
        pauseList.clear();
        pauseListRemoveLog.clear();

        DaintyDBHelper.getDaintyDBHelper(this).searchDownloadTable("select * from "
                        + DaintyDBHelper.DTB_NAME + " order by downloadTIME desc",
                new DaintyDBHelper.OnSearchDownloadTableListener() {
                    @Override
                    public void onResult(ArrayList<FileDownloadBean> mDownloadData) {
                        Log.d("download", "数据库:" + mDownloadData.size());
                        for (FileDownloadBean bean : mDownloadData)
                            pauseList.put(bean.getDownloadUrl(), bean);
                        data.addAll(mDownloadData);
                        File savePath = new File("/storage/emulated/0/DaintyDownloads");
                        if (savePath.exists()) {
                            files = savePath.listFiles();
                            if (files != null) {
                                for (File file : files) {
                                    if (file.isDirectory()) continue;
                                    if (data.contains(new FileDownloadBean(file.getName())))
                                        continue;
                                    FileDownloadBean fileInfo = new FileDownloadBean(file.getName());
                                    DownloaderTask task = DownloadHelper.getDownloadFile(file.getAbsolutePath());
                                    if (task != null) {
                                        fileInfo.setDownloading(true);
                                        fileInfo.setFinished(false);
                                        fileInfo.setLastModified(task.getTime());
                                        fileInfo.setDownloadProgress(task.getProgress());
                                        fileInfo.setFileSize(task.getFileSize());
                                        fileInfo.setDownloadUrl(task.getDownloadUrl());
                                    } else {
                                        fileInfo.setDownloading(false);
                                        fileInfo.setFinished(true);
                                        fileInfo.setLastModified(file.lastModified());
                                        fileInfo.setFileSize((int) file.length());
                                    }
                                    fileInfo.setFilePath(file.getAbsolutePath());
                                    data.add(fileInfo);
                                }

                            }
                            Collections.sort(data);
                            if (adapter != null)
                                adapter.notifyDataSetChanged();
                        }
                    }
                });

        refreshStorageStatus();
    }

    @SuppressLint("SetTextI18n")
    private void showNetSpeed() {
        if (downloadRecordList.getChildCount() != 0 && data.size() != 0) {
            downloadingCount = DownloadHelper.downloadList.size();
            int downloadItemInList = 0;
            final int childIndex = downloadRecordList.getFirstVisiblePosition();
            for (int i = downloadRecordList.getFirstVisiblePosition(); i <= downloadRecordList.getLastVisiblePosition(); i++) {
                if (i >= data.size()) return;
                if (data.get(i).isDownloading()) {
                    downloadItemInList++;
                    if (downloadItemInList > downloadingCount) break;
                    final int j = i;

                    DownloaderTask task = DownloadHelper.getDownloadFile(data.get(i).getFilePath());

                    if (task == null) return;
                    final int progress = task.getProgress();
                    if (progress != 0 && progress != data.get(j).getDownloadProgress()) {
                        View view = downloadRecordList.getChildAt(i - childIndex);
                        final ProgressBar progressBar = view.findViewById(R.id.download_progress);
                        final TextView speed = view.findViewById(R.id.download_speed);
                        Log.d("download", "task进度:" + progress + "bean进度:" + data.get(j).getDownloadProgress());
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                progressBar.setProgress(progress);
                                String downloadSpeed = Formatter.formatFileSize(DownloadRecordActivity.this, progress - data.get(j).getDownloadProgress()) + "/s";
                                speed.setText(downloadSpeed);
                                data.get(j).setDownloadProgress(progress);
                                data.get(j).setSpeed(downloadSpeed);
                            }
                        });
                    }
                }
            }
        }
    }

    private void refreshStorageStatus() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getPath());
            long blockSize = statFs.getBlockSizeLong();
            long totalBlocks = statFs.getBlockCountLong();
            long availableBlocks = statFs.getAvailableBlocksLong();
            String totalSize = Formatter.formatFileSize(this, blockSize * totalBlocks);
            String availableSize = Formatter.formatFileSize(this, blockSize * availableBlocks);
            textProgressBar.setTextAndProgress("内置存储可用:" + availableSize + "/共:" + totalSize, (int) ((float) availableBlocks / totalBlocks * 100));
        } else {
            textProgressBar.setTextAndProgress("内置存储不可用", 0);
        }
    }

//    /*
//    每隔一秒发送一次广播
//     */
    private BroadcastReceiver downloadStatus = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getBooleanExtra("finish_download", false)) {
                initData();
            }
        }
    };

}