package com.aefyr.sai.ui.dialogs;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;

import com.aefyr.sai.utils.Theme;
import com.github.angads25.filepicker.model.DialogProperties;
import com.github.angads25.filepicker.view.FilePickerDialog;

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

public class FilePickerDialogFragment extends DialogFragment {

    private static final String ARG_TAG = "tag";
    private static final String ARG_TITLE = "title";
    private static final String ARG_SELECTION_MODE = "selection_mode";
    private static final String ARG_SELECTION_TYPE = "selection_type";
    private static final String ARG_ROOT_FOLDER = "root";
    private static final String ARG_STARTING_FOLDER = "start";
    private static final String ARG_ERROR_FOLDER = "error";
    private static final String ARG_EXTENSIONS = "extensions";
    private static final String ARG_SORT_BY = "sort_by";
    private static final String ARG_SORT_ORDER = "sort_order";

    public interface OnFilesSelectedListener {
        void onFilesSelected(String tag, List<File> files);
    }

    private OnFilesSelectedListener mListener;

    private String mTag;
    private String mTitle = "Select files";
    private DialogProperties mDialogProperties = new DialogProperties();

    public static FilePickerDialogFragment newInstance(String tag, String title, DialogProperties properties) {
        FilePickerDialogFragment fragment = new FilePickerDialogFragment();

        Bundle args = new Bundle();
        args.putString(ARG_TAG, tag);
        args.putString(ARG_TITLE, title);
        args.putInt(ARG_SELECTION_MODE, properties.selection_mode);
        args.putInt(ARG_SELECTION_TYPE, properties.selection_type);
        args.putString(ARG_ROOT_FOLDER, properties.root.getAbsolutePath());
        args.putString(ARG_STARTING_FOLDER, properties.offset.getAbsolutePath());
        args.putString(ARG_ERROR_FOLDER, properties.error_dir.getAbsolutePath());
        args.putStringArray(ARG_EXTENSIONS, properties.extensions);
        args.putInt(ARG_SORT_BY, properties.sortBy);
        args.putInt(ARG_SORT_ORDER, properties.sortOrder);
        //properties.
        //args.putInt(ARG_SORT_BY, properties.);

        fragment.setArguments(args);

        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle args = getArguments();
        if (args == null)
            return;

        mTag = args.getString(ARG_TAG);
        mTitle = args.getString(ARG_TITLE);

        mDialogProperties.selection_mode = args.getInt(ARG_SELECTION_MODE, mDialogProperties.selection_mode);
        mDialogProperties.selection_type = args.getInt(ARG_SELECTION_TYPE, mDialogProperties.selection_type);
        mDialogProperties.root = new File(args.getString(ARG_ROOT_FOLDER, mDialogProperties.root.getAbsolutePath()));
        mDialogProperties.offset = new File(args.getString(ARG_STARTING_FOLDER, mDialogProperties.offset.getAbsolutePath()));
        mDialogProperties.error_dir = new File(args.getString(ARG_ERROR_FOLDER, mDialogProperties.error_dir.getAbsolutePath()));
        mDialogProperties.extensions = args.getStringArray(ARG_EXTENSIONS);
        mDialogProperties.sortBy = args.getInt(ARG_SORT_BY, mDialogProperties.sortBy);
        mDialogProperties.sortOrder = args.getInt(ARG_SORT_ORDER, mDialogProperties.sortOrder);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        FilePickerDialog dialog = new FilePickerDialog(getContext(), mDialogProperties, Theme.getInstance(getContext()).getCurrentTheme().getTheme());
        dialog.setDialogSelectionListener((files) -> {
            if (mListener == null)
                return;

            ArrayList<File> selectedFiles = new ArrayList<>(files.length);

            for (String file : files)
                selectedFiles.add(new File(file));

            mListener.onFilesSelected(mTag, selectedFiles);
        });
        dialog.setTitle(mTitle);
        return dialog;
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            if (getParentFragment() != null)
                mListener = (OnFilesSelectedListener) getParentFragment();
            else
                mListener = (OnFilesSelectedListener) getActivity();
        } catch (Exception e) {
            throw new IllegalStateException("Activity/Fragment that uses FilePickerDialogFragment must implement FilePickerDialogFragment.OnFilesSelectedListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }
}