package net.arvin.selector.uis.fragments;

import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;

import net.arvin.selector.R;
import net.arvin.selector.data.ConstantData;
import net.arvin.selector.data.FileData;
import net.arvin.selector.entities.FileEntity;
import net.arvin.selector.entities.FolderEntity;
import net.arvin.selector.listeners.OnItemClickListener;
import net.arvin.selector.listeners.OnItemSelectListener;
import net.arvin.selector.uis.adapters.SelectorAdapter;
import net.arvin.selector.uis.views.DividerGridItemDecoration;
import net.arvin.selector.uis.views.FolderDialog;
import net.arvin.selector.utils.PSUtil;

import java.util.ArrayList;

/**
 * Created by arvinljw on 17/12/25 14:17
 * Function:
 * Desc:
 */
public class SelectorFragment extends BaseFragment implements OnItemClickListener, OnItemSelectListener, FolderDialog.OnFolderSelectedListener {
    private TextView mTvFolderName;
    private TextView mTvReview;

    private SelectorAdapter mAdapter;

    private ArrayList<FolderEntity> mData;
    private ArrayList<FileEntity> mItems;
    private FolderDialog mFolderDialog;

    @Override
    protected int getLayout() {
        return R.layout.ps_fragment_selector;
    }

    @Override
    protected void init(Bundle savedInstanceState) {
        mItems = new ArrayList<>();
        RecyclerView recyclerView = mRoot.findViewById(R.id.ps_recycler_view);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), ConstantData.VALUE_SPAN_COUNT));
        recyclerView.addItemDecoration(new DividerGridItemDecoration(getActivity()));
        mAdapter = new SelectorAdapter(getActivity(), mItems);
        mAdapter.setItemClickListener(this);
        mAdapter.setItemSelectListener(this);
        recyclerView.setAdapter(mAdapter);

        mTvFolderName = mRoot.findViewById(R.id.ps_tv_folder_name);
        mTvReview = mRoot.findViewById(R.id.ps_tv_review);
        mTvFolderName.setOnClickListener(getChangeFolderListener());
        mTvReview.setOnClickListener(getReviewListener());

        Bundle bundle = getArguments();
        if (bundle != null) {
            initSelectorInfo(bundle);
            ConstantData.setSelectedItems(bundle.getStringArrayList(ConstantData.KEY_SELECTED_PICTURES));
        }
        loadData();
    }

    private void loadData() {
        FileData.getImageFolderData(getActivity(), new FileData.DataCallback() {
            @Override
            public void dataCallback(ArrayList<FolderEntity> data) {
                mData = data;
                if (mData.size() > 0) {
                    ConstantData.setFolders(mData);

                    mItems.clear();
                    FolderEntity folderEntity = mData.get(0);
                    folderEntity.setSelected(true);
                    mItems.addAll(folderEntity.getImages());
                    mAdapter.notifyDataSetChanged();
                    mTvFolderName.setText(folderEntity.getFolderName());

                    int selectedCount = ConstantData.getSelectedItems().size();
                    setEnsure(selectedCount);
                    setReviewCount(selectedCount);
                    mAdapter.setSelectedCount(selectedCount);
                }
            }
        });
    }

    private void initSelectorInfo(Bundle bundle) {
        initBaseInfo(bundle);

        mAdapter.setWithCamera(mWithCamera);
        mAdapter.setMaxCount(mSingleSelection ? ConstantData.VALUE_COUNT_SINGLE : mMaxCount);
        mAdapter.notifyDataSetChanged();

        setEnsureEnable(mSingleSelection);
        if (mSingleSelection) {
            mTvEnsure.setVisibility(View.GONE);
        }
        setReviewCount(0);
    }

    @Override
    public void update(Bundle bundle) {
        if (bundle == null) {
            return;
        }
        int fromPos = bundle.getInt(ConstantData.KEY_FROM_POS, ConstantData.VALUE_CHANGE_FRAGMENT_SELECTOR);
        if (fromPos == ConstantData.VALUE_CHANGE_FRAGMENT_TAKE_PHOTO) {
            mItems.add(0, new FileEntity(bundle.getString(ConstantData.KEY_NEW_PIC)));
            mAdapter.notifyDataSetChanged();
        } else if (fromPos == ConstantData.VALUE_CHANGE_FRAGMENT_REVIEW) {
            int selectedCount = getSelectedPictures().size();
            setEnsure(selectedCount);
            setReviewCount(selectedCount);
            mAdapter.setSelectedCount(selectedCount);
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    protected ArrayList<String> getSelectedPictures() {
        return ConstantData.getSelectedItems();
    }

    @Override
    protected ArrayList<String> getSelectedVideos() {
        return PSUtil.getSelectedVideos(mData);
    }

    @Override
    public void onItemClick(View v, int position) {
        if (position == -1) {
            if (mWithCamera) {
                if (mTransactionListener != null) {
                    mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_TAKE_PHOTO,
                            ConstantData.toTakePhotoBundle(getArguments()));
                }
            }
            return;
        }
        if (mTransactionListener != null) {
            if (mSingleSelection) {
                mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_CROP,
                        ConstantData.toCropBundle(getArguments(), mItems.get(position)));
            } else {//预览
                mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_REVIEW,
                        ConstantData.toReviewBundle(getArguments(), mItems, position));
            }
        }
    }

    @Override
    public void onItemSelected(View v, int selectedCount) {
        setEnsure(selectedCount);
        setReviewCount(selectedCount);
    }

    private void setReviewCount(int selectedCount) {
        if (mTvReview == null) {
            return;
        }
        if (mSingleSelection) {
            mTvReview.setVisibility(View.GONE);
            return;
        }
        if (selectedCount == 0) {
            mTvReview.setText(R.string.ps_review);
            mTvReview.setEnabled(false);
            return;
        }
        mTvReview.setEnabled(true);
        mTvReview.setText(getString(R.string.ps_review_count, selectedCount));
    }

    private View.OnClickListener getChangeFolderListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mFolderDialog == null) {
                    mFolderDialog = new FolderDialog(getActivity(), mData);
                    mFolderDialog.setOnFolderSelectedListener(SelectorFragment.this);
                }
                mFolderDialog.show();
            }
        };
    }

    private View.OnClickListener getReviewListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mTransactionListener != null) {
                    mTransactionListener.switchFragment(ConstantData.VALUE_CHANGE_FRAGMENT_REVIEW,
                            ConstantData.toReviewBundle(getArguments(), mItems));
                }
            }
        };
    }

    @Override
    protected void onBackClicked() {
        getActivity().onBackPressed();
    }

    @Override
    public void onFolderSelected(View v, int position) {
        FolderEntity folderEntity = mData.get(position);
        if (folderEntity != null) {
            mItems.clear();
            mItems.addAll(folderEntity.getImages());
            mAdapter.notifyDataSetChanged();
            mTvFolderName.setText(folderEntity.getFolderName());
        }
    }

}