package com.github.ghmxr.apkextractor.ui;

import android.content.Context;
import android.content.DialogInterface;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import com.github.ghmxr.apkextractor.Global;
import com.github.ghmxr.apkextractor.R;
import com.github.ghmxr.apkextractor.items.AppItem;
import com.github.ghmxr.apkextractor.utils.FileUtil;
import com.github.ghmxr.apkextractor.utils.StorageUtil;

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

public class DataObbDialog extends AlertDialog implements View.OnClickListener {

    private final View view;
    private DialogDataObbConfirmedCallback callback;
    private final List<AppItem>list=new ArrayList<>();
    private final List<AppItem> list_data_controllable =new ArrayList<>();
    private final List<AppItem> list_obb_controllable=new ArrayList<>();
    private CheckBox cb_data;
    private CheckBox cb_obb;

    /**
     * @param export_list 传递进来的AppItem可为源数据,初始Data和Obb导出值为false
     */
    public DataObbDialog(@NonNull Context context, @NonNull List<AppItem>export_list, final DialogDataObbConfirmedCallback callback) {
        super(context);
        this.callback=callback;
        for(AppItem appItem:export_list){
            list.add(new AppItem(appItem,false,false));
        }
        view=LayoutInflater.from(context).inflate(R.layout.dialog_data_obb,null);
        cb_data=view.findViewById(R.id.dialog_checkbox_data);
        cb_obb=view.findViewById(R.id.dialog_checkbox_obb);
        TextView tv_att=view.findViewById(R.id.data_obb_att);
        tv_att.setText(context.getResources().getString(R.string.dialog_data_obb_message));
        setView(view);
        setTitle(context.getResources().getString(R.string.dialog_data_obb_title));

        setButton(AlertDialog.BUTTON_POSITIVE, context.getResources().getString(R.string.dialog_button_confirm), new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {}
        });
        setButton(AlertDialog.BUTTON_NEGATIVE,context.getResources().getString(R.string.dialog_button_cancel),new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {}
        });


    }

    @Override
    public void show(){
        super.show();
        getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(null);
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (DataObbDialog.this){
                    long data=0,obb=0;
                    for(AppItem item:list){
                        long data_item= FileUtil.getFileOrFolderSize(new File(StorageUtil.getMainExternalStoragePath()+"/android/data/"+item.getPackageName()));
                        long obb_item=FileUtil.getFileOrFolderSize(new File(StorageUtil.getMainExternalStoragePath()+"/android/obb/"+item.getPackageName()));
                        data+=data_item;
                        obb+=obb_item;
                        if(data_item>0) list_data_controllable.add(item);
                        if(obb_item>0) list_obb_controllable.add(item);
                    }
                    final long data_total=data;
                    final long obb_total=obb;
                    Global.handler.post(new Runnable() {
                        @Override
                        public void run() {
                            if(data_total==0&&obb_total==0){
                                cancel();
                                if(callback!=null)callback.onDialogDataObbConfirmed(list);
                                return;
                            }
                            view.findViewById(R.id.dialog_data_obb_wait_area).setVisibility(View.GONE);
                            view.findViewById(R.id.dialog_data_obb_show_area).setVisibility(View.VISIBLE);
                            cb_data.setEnabled(data_total>0);
                            cb_obb.setEnabled(obb_total>0);
                            cb_data.setText("Data("+ Formatter.formatFileSize(getContext(),data_total)+")");
                            cb_obb.setText("Obb("+Formatter.formatFileSize(getContext(),obb_total)+")");
                            getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(DataObbDialog.this);
                        }
                    });
                }
            }
        }).start();
    }

    @Override
    public void onClick(View v) {
        if(v.equals(getButton(AlertDialog.BUTTON_POSITIVE))){
            if(cb_data.isChecked()) for(AppItem item:list_data_controllable) item.exportData=true;
            if(cb_obb.isChecked()) for (AppItem item:list_obb_controllable) item.exportObb=true;
            if(callback!=null)callback.onDialogDataObbConfirmed(list);
            cancel();
        }
    }

    public interface DialogDataObbConfirmedCallback{
        void onDialogDataObbConfirmed(@NonNull List<AppItem>export_list);
    }
}