package com.netease.nim.uikit.common.media.picker.activity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.netease.nim.uikit.common.ToastHelper;

import com.netease.nim.uikit.R;
import com.netease.nim.uikit.api.wrapper.NimToolBarOptions;
import com.netease.nim.uikit.business.session.constant.Extras;
import com.netease.nim.uikit.business.session.constant.RequestCode;
import com.netease.nim.uikit.common.activity.ToolBarOptions;
import com.netease.nim.uikit.common.activity.UI;
import com.netease.nim.uikit.common.media.picker.adapter.PickerPreviewPagerAdapter;
import com.netease.nim.uikit.common.media.picker.model.PhotoInfo;
import com.netease.nim.uikit.common.media.picker.model.PickerContract;
import com.netease.nim.uikit.common.media.picker.util.PickerUtil;
import com.netease.nim.uikit.common.ui.imageview.BaseZoomableImageView;
import com.netease.nim.uikit.common.util.media.BitmapDecoder;
import com.netease.nim.uikit.common.util.media.ImageUtil;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class PickerAlbumPreviewActivity extends UI implements OnClickListener, OnPageChangeListener {

    public static final int RESULT_FROM_USER = RESULT_FIRST_USER + 1;

    public static void start(Activity activity, List<PhotoInfo> photos, int position, boolean supportOrig,
                             boolean isOrig, List<PhotoInfo> selectPhotoList, int mutiSelectLimitSize) {
        Intent intent = PickerContract.makePreviewDataIntent(photos, selectPhotoList);
        intent.setClass(activity, PickerAlbumPreviewActivity.class);
        intent.putExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, position);
        intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, supportOrig);
        intent.putExtra(Extras.EXTRA_IS_ORIGINAL, isOrig);
        intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, mutiSelectLimitSize);
        activity.startActivityForResult(intent, RequestCode.PICKER_IMAGE_PREVIEW);
    }

    public static void start(Fragment fragment, List<PhotoInfo> photos, int position, boolean supportOrig,
                             boolean isOrig, List<PhotoInfo> selectPhotoList, int mutiSelectLimitSize) {
        Intent intent = PickerContract.makePreviewDataIntent(photos, selectPhotoList);
        intent.setClass(fragment.getActivity(), PickerAlbumPreviewActivity.class);
        intent.putExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, position);
        intent.putExtra(Extras.EXTRA_SUPPORT_ORIGINAL, supportOrig);
        intent.putExtra(Extras.EXTRA_IS_ORIGINAL, isOrig);
        intent.putExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, mutiSelectLimitSize);
        fragment.startActivityForResult(intent, RequestCode.PICKER_IMAGE_PREVIEW);
    }

    private ViewPager imageViewPager;

    private PickerPreviewPagerAdapter imageViewPagerAdapter;

    private List<PhotoInfo> selectPhotoList = new ArrayList<PhotoInfo>();

    private List<PhotoInfo> photoLists = new ArrayList<PhotoInfo>();

    private int firstDisplayImageIndex = 0;

    private int currentPosition = -1;

    private int totalSize;

    private BaseZoomableImageView currentImageView;

    private int tempIndex = -1;

    @SuppressWarnings("unused")
    private LinearLayout previewOperationBar;

    private ImageButton originalImage;

    private boolean isSupportOriginal;

    private boolean isSendOriginalImage;

    private TextView originalImageSizeTip;

    private TextView previewSendBtn;

    private ImageButton previewSelectBtn;

    private int mutiSelectLimitSize;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nim_picker_image_preview_activity);

        ToolBarOptions options = new NimToolBarOptions();
        setToolBar(R.id.toolbar, options);

        proceedExtras();
        initActionBar();
        initUI();
    }

    private void proceedExtras() {
        Intent intent = getIntent();
        isSupportOriginal = intent.getBooleanExtra(Extras.EXTRA_SUPPORT_ORIGINAL, false);
        isSendOriginalImage = intent.getBooleanExtra(Extras.EXTRA_IS_ORIGINAL, false);
        firstDisplayImageIndex = intent.getIntExtra(Extras.EXTRA_PREVIEW_CURRENT_POS, 0);
        mutiSelectLimitSize = intent.getIntExtra(Extras.EXTRA_MUTI_SELECT_SIZE_LIMIT, 9);

        photoLists.addAll(PickerContract.getPhotos(intent));
        totalSize = photoLists.size();

        selectPhotoList.clear();
        selectPhotoList.addAll(PickerContract.getSelectPhotos(intent));
    }

    private void initActionBar() {
        previewSelectBtn = findViewById(R.id.picker_image_preview_photos_select);
        previewSelectBtn.setOnClickListener(this);
    }

    private void initUI() {
        previewOperationBar = findViewById(R.id.picker_image_preview_operator_bar);
        originalImage = findViewById(R.id.picker_image_preview_orignal_image);
        originalImage.setOnClickListener(this);
        originalImageSizeTip = findViewById(R.id.picker_image_preview_orignal_image_tip);
        if (!isSupportOriginal) {
            originalImage.setVisibility(View.INVISIBLE);
            originalImageSizeTip.setVisibility(View.INVISIBLE);
        }
        previewSendBtn = findViewById(R.id.picker_image_preview_send);
        previewSendBtn.setOnClickListener(this);
        updateSelectBtnStatus();
        updateOriImageSizeTip(isSendOriginalImage);

        imageViewPager = findViewById(R.id.picker_image_preview_viewpager);
        imageViewPager.setOnPageChangeListener(this);
        imageViewPager.setOffscreenPageLimit(2);
        imageViewPagerAdapter = new PickerPreviewPagerAdapter(this, photoLists, getLayoutInflater(),
                imageViewPager.getLayoutParams().width, imageViewPager.getLayoutParams().height, this);
        imageViewPager.setAdapter(imageViewPagerAdapter);

        setTitleIndex(firstDisplayImageIndex);
        updateTitleSelect(firstDisplayImageIndex);
        imageViewPager.setCurrentItem(firstDisplayImageIndex);
    }

    private void updateTitleSelect(int index) {
        if (photoLists == null || index >= photoLists.size())
            return;

        PhotoInfo photo = photoLists.get(index);
        if (photo.isChoose()) {
            previewSelectBtn.setImageResource(R.drawable.nim_picker_image_selected);
        } else {
            previewSelectBtn.setImageResource(R.drawable.nim_picker_preview_unselected);
        }
    }

    private void setTitleIndex(int index) {
        if (totalSize <= 0) {
            setTitle("");
        } else {
            index++;
            setTitle(index + "/" + totalSize);
        }
    }

    public void updateCurrentImageView(final int position) {
        if (photoLists == null
                || (position > 0
                && position >= photoLists.size()))
            return;

        if (currentPosition == position) {
            return;
        } else {
            currentPosition = position;
        }

        LinearLayout currentLayout = imageViewPager.findViewWithTag(position);
        if (currentLayout == null) {
            Handler mHandler = new Handler();
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    updateCurrentImageView(position);
                }
            }, 300);
            return;
        }
        currentImageView = (BaseZoomableImageView) currentLayout.findViewById(R.id.imageView);
        currentImageView.setViewPager(imageViewPager);

        setImageView(photoLists.get(position));
    }

    public void setImageView(PhotoInfo info) {
        if (info == null) {
            return;
        }

        if (info.getAbsolutePath() == null) {
            return;
        }

        Bitmap bitmap = BitmapDecoder.decodeSampledForDisplay(info.getAbsolutePath());
        if (bitmap == null) {
            currentImageView.setImageBitmap(ImageUtil.getDefaultBitmapWhenGetFail());
            ToastHelper.showToastLong(this, R.string.picker_image_error);
        } else {
            try {
                bitmap = ImageUtil.rotateBitmapInNeeded(info.getAbsolutePath(), bitmap);
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            }
            currentImageView.setImageBitmap(bitmap);
        }
    }

    private void restoreList() {
        if (tempIndex != -1) {
            imageViewPager.setAdapter(imageViewPagerAdapter);
            setTitleIndex(tempIndex);
            imageViewPager.setCurrentItem(tempIndex);
            tempIndex = -1;
        }
    }

    private void updateSelectBtnStatus() {
        int selectSize = selectPhotoList.size();
        if (selectSize > 0) {
            previewSendBtn.setEnabled(true);
            previewSendBtn.setText(String.format(this.getResources().getString(
                    R.string.picker_image_send_select), selectSize));
        } else {
            previewSendBtn.setEnabled(true);
            previewSendBtn.setText(R.string.picker_image_send);
        }
    }

    private void updatePreviewSelectBtnStatus(boolean isChoose) {
        if (isChoose) {
            previewSelectBtn.setImageResource(R.drawable.nim_picker_image_selected);
        } else {
            previewSelectBtn.setImageResource(R.drawable.nim_picker_preview_unselected);
        }
    }

    private void updateOriImageSizeTip(boolean isOri) {
        if (selectPhotoList == null)
            return;
        if (isOri) {
            long totalSize = 0;
            for (int i = 0; i < selectPhotoList.size(); i++) {
                PhotoInfo pi = selectPhotoList.get(i);
                totalSize += pi.getSize();
            }
            originalImageSizeTip.setText(String.format(this.getResources().getString(
                    R.string.picker_image_preview_original_select), PickerUtil.getFileSizeString(totalSize)));
            originalImage.setImageResource(R.drawable.nim_picker_orignal_checked);
        } else {
            originalImageSizeTip.setText(R.string.picker_image_preview_original);
            originalImage.setImageResource(R.drawable.nim_picker_orignal_normal);
        }
    }

    private boolean checkSelectPhoto(PhotoInfo photo) {
        boolean isSelect = false;
        for (int i = 0; i < selectPhotoList.size(); i++) {
            PhotoInfo select = selectPhotoList.get(i);
            if (select.getImageId() == photo.getImageId()) {
                isSelect = true;
                break;
            }
        }

        return isSelect;
    }

    private void removeSelectPhoto(PhotoInfo photo) {
        Iterator<PhotoInfo> lIterator = selectPhotoList.iterator();
        while (lIterator.hasNext()) {
            PhotoInfo select = lIterator.next();
            if (select.getImageId() == photo.getImageId()) {
                lIterator.remove();
            }
        }
    }

    @Override
    public void onResume() {
        // restore the data source
        restoreList();

        super.onResume();
    }

    @Override
    public void onPause() {
        // save the data source and recycle all bitmaps
        imageViewPager.setAdapter(null);
        tempIndex = currentPosition;
        currentPosition = -1;

        super.onPause();
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.picker_image_preview_photos_select) {
            if (photoLists == null || currentPosition >= photoLists.size())
                return;

            PhotoInfo selectPhoto = photoLists.get(currentPosition);
            boolean isChoose = selectPhoto.isChoose();
            if (selectPhotoList != null && selectPhotoList.size() >= mutiSelectLimitSize && !isChoose) {
                ToastHelper.showToast(this, String.format(getResources().getString(R.string.picker_image_exceed_max_image_select)
                        , mutiSelectLimitSize));
                return;
            }
            selectPhoto.setChoose(!isChoose);
            updatePreviewSelectBtnStatus(!isChoose);

            // check
            if (!isChoose) {
                boolean isSelect = checkSelectPhoto(selectPhoto);
                if (!isSelect) {
                    selectPhotoList.add(selectPhoto);
                }
            } else {
                removeSelectPhoto(selectPhoto);
            }
            // update bottom bar
            updateSelectBtnStatus();
            // 如果没有选择,则自动取消原图发送
            if (selectPhotoList.size() == 0 && isSendOriginalImage) {
                isSendOriginalImage = false;
            }
            updateOriImageSizeTip(isSendOriginalImage);
        } else if (v.getId() == R.id.picker_image_preview_send) {
            if (selectPhotoList != null && selectPhotoList.size() == 0) { // 没有选择,点击发送则发送当前图片
                PhotoInfo current = photoLists.get(currentPosition);
                current.setChoose(true);
                selectPhotoList.add(current);
            }
            setResult(RESULT_OK, PickerContract.makeDataIntent(selectPhotoList, isSendOriginalImage));
            finish();
        } else if (v.getId() == R.id.picker_image_preview_orignal_image) {
            if (!isSendOriginalImage) {
                isSendOriginalImage = true;
                // 如果已选图片小于mutiSelectLimitSize,点击发送原图,自动选择当前页面
                int selectSize = selectPhotoList != null ? selectPhotoList.size() : 0;
                if (selectSize < mutiSelectLimitSize) {
                    PhotoInfo cur = photoLists.get(currentPosition);
                    if (!cur.isChoose()) {
                        cur.setChoose(true);
                        selectPhotoList.add(cur);
                        updateSelectBtnStatus();
                        updatePreviewSelectBtnStatus(true);
                    }
                }
            } else {
                isSendOriginalImage = false;
            }
            updateOriImageSizeTip(isSendOriginalImage);
        }
    }

    @Override
    public void onBackPressed() {
        setResult(RESULT_FROM_USER, PickerContract.makePreviewDataIntent(photoLists, selectPhotoList,
                isSendOriginalImage));
        finish();
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    @Override
    public void onPageSelected(int arg0) {
        setTitleIndex(arg0);
        updateTitleSelect(arg0);
    }
}