package me.kareluo.imaging;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.ViewSwitcher;

import com.nimble.androidnative.customcamera.DesignUtils;

import java.lang.ref.WeakReference;

import me.kareluo.imaging.core.IMGMode;
import me.kareluo.imaging.core.IMGText;
import me.kareluo.imaging.view.IMGColorGroup;
import me.kareluo.imaging.view.IMGView;

/**
 * Created by felix on 2017/12/5 下午3:08.
 */

abstract class IMGEditBaseActivity extends Activity implements View.OnClickListener,
        IMGTextEditDialog.Callback, RadioGroup.OnCheckedChangeListener,
        DialogInterface.OnShowListener, DialogInterface.OnDismissListener {
    private static final String TAG = IMGEditBaseActivity.class.getSimpleName();

    protected IMGView mImgView;

    private RadioGroup mModeGroup;

    private IMGColorGroup mColorGroup;

    private IMGTextEditDialog mTextDialog;

    private View mLayoutOpSub;

    private ViewSwitcher mOpSwitcher, mOpSubSwitcher;
    protected RadioButton mRb_doodle;

    public static final int OP_HIDE = -1;

    public static final int OP_NORMAL = 0;

    public static final int OP_CLIP = 1;

    public static final int OP_SUB_DOODLE = 0;

    public static final int OP_SUB_MOSAIC = 1;
    public boolean enableEdit;

    private static float fontScale = 1f;



    @Override
    public Resources getResources() {
        Log.i(TAG, "getResources");
        Resources resources = super.getResources();
        return DesignUtils.getResources(this, resources, fontScale);
    }

    @Override
    protected void attachBaseContext(Context base) {
        Log.i(TAG, "getResources");
        super.attachBaseContext(DesignUtils.attachBaseContext(base, fontScale));
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bitmap bitmap = getBitmap();
        if (bitmap != null) {
            setContentView(getId(this, "image_edit_activity", "layout"));
            initViews();
            mImgView.setImageBitmap(bitmap);
            mImgView.getmImage().setActivity(this);
            mImgView.getmImage().setMarkString(getMarkString());
            showEditBar(enableEdit);
            onCreated();
        } else finish();
    }

    public void onCreated() {
    }

    @Override
    protected void onResume() {
        super.onResume();
        //需要延迟一段时间的原因是，画笔画布等初始化需要一定的时间。
        new MyHandler(this).sendEmptyMessageDelayed(1, 100);
    }

    private int getId(Context context, String name, String type) {
        return context.getResources().getIdentifier(name, type, context.getPackageName());
    }

    private void initViews() {
        mImgView = findViewById(getId(this, "image_canvas", "id"));
        mModeGroup = findViewById(getId(this, "rg_modes", "id"));

        mOpSwitcher = findViewById(getId(this, "vs_op", "id"));
        mOpSubSwitcher = findViewById(getId(this, "vs_op_sub", "id"));
        mRb_doodle = findViewById(getId(this, "rb_doodle", "id"));

        mColorGroup = findViewById(getId(this, "cg_colors", "id"));
        mColorGroup.setOnCheckedChangeListener(this);

        mLayoutOpSub = findViewById(getId(this, "layout_op_sub", "id"));

        mImgView.setOnEventListener(new IMGView.OnEventListener() {
            @Override
            public void onActionDown() {
                //隐藏工具栏
                ObjectAnimator aphaAnimator = ObjectAnimator.ofFloat(mOpSwitcher, "alpha", 1, 0);
                aphaAnimator.setDuration(200);
                aphaAnimator.start();
                mOpSwitcher.setVisibility(View.GONE);
            }

            @Override
            public void onActionUp() {
                //显示工具栏
                ObjectAnimator aphaAnimator = ObjectAnimator.ofFloat(mOpSwitcher, "alpha", 0, 1);
                aphaAnimator.setDuration(200);
                aphaAnimator.start();
                mOpSwitcher.setVisibility(View.VISIBLE);
            }
        });

    }

    private static class MyHandler extends Handler {
        private final WeakReference<IMGEditBaseActivity> mActivity;

        public MyHandler(IMGEditBaseActivity activity) {
            mActivity = new WeakReference<IMGEditBaseActivity>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            System.out.println(msg);
            if (mActivity.get() == null) {
                return;
            }
            mActivity.get().mRb_doodle.performClick();
        }
    }


    @Override
    public void onClick(View v) {
        int vid = v.getId();
        if (vid == getId(this, "rb_doodle", "id")) {
            onModeClick(IMGMode.DOODLE);
        } else if (vid == getId(this, "btn_text", "id")) {
            onTextModeClick();
        } else if (vid == getId(this, "rb_mosaic", "id")) {
            onModeClick(IMGMode.MOSAIC);
        } else if (vid == getId(this, "btn_clip", "id")) {
            onModeClick(IMGMode.CLIP);
        } else if (vid == getId(this, "btn_undo", "id")) {
            onUndoClick();
        } else if (vid == getId(this, "tv_done", "id")) {
            onDoneClick();
        } else if (vid == getId(this, "tv_cancel", "id")) {
            onCancelClick();
        } else if (vid == getId(this, "ib_clip_cancel", "id")) {
            onCancelClipClick();
        } else if (vid == getId(this, "ib_clip_done", "id")) {
            onDoneClipClick();
        } else if (vid == getId(this, "tv_clip_reset", "id")) {
            onResetClipClick();
        } else if (vid == getId(this, "ib_clip_rotate", "id")) {
            onRotateClipClick();
        }
    }

    public void updateModeUI() {
        IMGMode mode = mImgView.getMode();
        switch (mode) {
            case DOODLE:
                mModeGroup.check(getId(this, "rb_doodle", "id"));
                setOpSubDisplay(OP_SUB_DOODLE);
                break;
            case MOSAIC:
                mModeGroup.check(getId(this, "rb_mosaic", "id"));
                setOpSubDisplay(OP_SUB_MOSAIC);
                break;
            case NONE:
                mModeGroup.clearCheck();
                setOpSubDisplay(OP_HIDE);
                break;
        }
    }

    public void onTextModeClick() {
        if (mTextDialog == null) {
            mTextDialog = new IMGTextEditDialog(this, this);
            mTextDialog.setOnShowListener(this);
            mTextDialog.setOnDismissListener(this);
        }
        mTextDialog.show();
    }

    @Override
    public final void onCheckedChanged(RadioGroup group, int checkedId) {
        onColorChanged(mColorGroup.getCheckColor());
    }

    public void setOpDisplay(int op) {
        if (op >= 0) {
            mOpSwitcher.setDisplayedChild(op);
        }
    }

    public void setOpSubDisplay(int opSub) {
        if (opSub < 0) {
            mLayoutOpSub.setVisibility(View.INVISIBLE);
        } else {
            mOpSubSwitcher.setDisplayedChild(opSub);
            mLayoutOpSub.setVisibility(View.VISIBLE);
        }
    }

    public void showEditBar(boolean show) {
        if (show) {
            mModeGroup.setVisibility(View.VISIBLE);
        } else {
            mModeGroup.setVisibility(View.INVISIBLE);
        }
    }

    @Override
    public void onShow(DialogInterface dialog) {
        mOpSwitcher.setVisibility(View.GONE);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        mOpSwitcher.setVisibility(View.VISIBLE);
    }

    public abstract Bitmap getBitmap();

    public abstract void onModeClick(IMGMode mode);

    public abstract void onUndoClick();

    public abstract void onCancelClick();

    public abstract void onDoneClick();

    public abstract void onCancelClipClick();

    public abstract void onDoneClipClick();

    public abstract void onResetClipClick();

    public abstract void onRotateClipClick();

    public abstract String getMarkString();

    public abstract void onColorChanged(int checkedColor);

    @Override
    public abstract void onText(IMGText text);
}
