package com.iwhalecloud.picedit;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.dyh.rnpicture.edit.AddWatermarkActivity;
import com.dyh.rnpicture.utils.Constants;
import com.dyh.rnpicture.utils.FastBlurUtil;
import com.dyh.rnpicture.utils.FrameFilterUtils;
import com.dyh.rnpicture.utils.SimpleThreadManager;
import com.dyh.rnpicture.widget.RaduisImageView;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.ThemedReactContext;
import com.operate.ImageObject;
import com.operate.OperateUtils;
import com.operate.OperateView;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class PicEditView extends RelativeLayout implements View.OnClickListener {
    private final Context context;

    private Activity activity;

    private RelativeLayout content_layout;

    private OperateView operateView;

    private String camera_path;

    private String mPath = null;

    OperateUtils operateUtils;

    private TextView btn_ok, btn_cancel;

    private ImageView chunvzuo;

    private RaduisImageView orignView;

    private Bitmap resizeBmp;

    private Bitmap blurBmp;

    private boolean isOrign = true;

    private String[] icons;

    private LinearLayout filtersList_layout;

    private RelativeLayout bottom_parent_rl;

    private boolean scale = false;

    private TextView expandBtn;

    private TextView smallBtn;

    private Bitmap scaleBitmap;

    private WeakHandler mHandler;

    private static final int MSG_BG = 0x110;

    private static final int MSG_MARKS = 0x111;

    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(2);

    private MyEventEmitter myEventEmitter;

    private TextView titleView;

    public PicEditView(ThemedReactContext reactContext, Activity activity) {
        this(reactContext);
        this.activity = activity;
        this.myEventEmitter = new MyEventEmitter(reactContext);
    }

    public MyEventEmitter getMyEventEmitter() {
        return myEventEmitter;
    }

    @Override
    public void setId(int id) {
        super.setId(id);
        Log.i("dyh", "dyh:" + id);
        myEventEmitter.setViewId(id);

    }

    public PicEditView(Context context) {
        super(context);
        this.context = context;
        init();
    }

    public PicEditView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
    }

    public PicEditView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        init();
    }

    private class WeakHandler extends Handler {
        WeakReference<PicEditView> weakReference;

        public WeakHandler(PicEditView button) {
            this.weakReference = new WeakReference<PicEditView>(button);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            PicEditView picEditView = weakReference.get();
            switch (msg.what) {
                case 1:
                    if (resizeBmp != null) {
                        Log.i("LinearLayoutW", content_layout.getWidth() + "");
                        Log.i("LinearLayoutH", content_layout.getHeight() + "");
                        // 取消定时器
                        executorService.shutdown();
                        fillContent();
                    }
                    break;
                case MSG_BG:
                    orignView.setImageBitmap(resizeBmp);
                    fillContent();
                    break;
                case MSG_MARKS:
                    Bitmap bmp = (Bitmap) msg.obj;
                    RaduisImageView imv = new RaduisImageView(context);
                    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(Utils.dip2px(80),
                        Utils.dip2px(80));
//                    layoutParams.setMargins(0, 0, 5, 5);
                    layoutParams.rightMargin = Utils.dip2px(20);
                    imv.setLayoutParams(layoutParams);
                    imv.setImageBitmap(bmp);
                    imv.setScaleType(ImageView.ScaleType.FIT_XY);
                    imv.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            addpic(bmp);
                        }
                    });
                    filtersList_layout.addView(imv);
                    break;
            }
        }
    }

    // 以下代码修复通过动态 addView 后看不到的问题

    @Override
    public void requestLayout() {
        super.requestLayout();
        post(measureAndLayout);
    }

    private final Runnable measureAndLayout = new Runnable() {
        @Override
        public void run() {
            measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
            layout(getLeft(), getTop(), getRight(), getBottom());
        }
    };

    public void init() {

        LayoutInflater.from(context).inflate(R.layout.addwatermark, this, true);
        mHandler = new WeakHandler(this);
        operateUtils = new OperateUtils(activity, context);
        initView();
    }

    public void setTitleView(String title) {
        titleView.setText(title);
    }

    public void setSource(String _path) {
        this.camera_path = _path;
        // 耗时操作哟
        SimpleThreadManager.getThreadPollProxy().execute(new Runnable() {
            @Override
            public void run() {
                // final List<Bitmap> bitmaps = new ArrayList<>();
                try {
                    Bitmap bm = FrameFilterUtils.GetUrlBitmap(camera_path);
                    if (bm != null) {
                        resizeBmp = FrameFilterUtils.getReSizeBitmap(bm, Utils.width, Utils.height);

                    }
                    else {
                        // 加载本地图片
                        // 读取图片角度
                       int degree= FrameFilterUtils.readPictureDegree(camera_path);
                        // 进行旋转
                        Bitmap bmp = FrameFilterUtils.getSmallBitmap(camera_path, Utils.width, Utils.height);
                        resizeBmp = FrameFilterUtils.getReSizeBitmap(bmp, Utils.width, Utils.height);
                        resizeBmp = FrameFilterUtils.rotaingImageView(degree, resizeBmp);
                    }
                    // Log.i("dyh2", Utils.width+" "+Utils.height);

                    scaleBitmap = resizeBmp;
                    mHandler.sendEmptyMessage(MSG_BG);

                }
                catch (Exception e) {
                    e.printStackTrace();
                    // myEventEmitter.receiveEvent(MyEventEmitter.EVENT_ERROR,null);
                }
            }
        });
    }

    public void setMarks(String[] icons) {
        this.icons = icons;
        // 耗时操作哟
        SimpleThreadManager.getThreadPollProxy().execute(new Runnable() {
            @Override
            public void run() {
                try {
                    AssetManager assetManager =  context.getAssets();
                    for (int i = 0; i < icons.length; i++) {
                        String url = icons[i];
                        // 判断一下传的是http 还是本地加载
                        Bitmap bitmap = FrameFilterUtils.GetUrlBitmap(url);
                        if (bitmap != null) {
                            Log.i("dyh", url);
                        }
                        else {
//                            if (url.endsWith(".png") || url.endsWith(".jpg") || url.endsWith("jpeg")) {
//                                url = url.replace("/", "_");
//                                url = url.substring(0, url.indexOf("."));
//
//                            }
//                            int resourceID = context.getResources().getIdentifier(url, "drawable",
//                                context.getPackageName());
//                            System.out.println("url:" + url + "resourceID:" + resourceID);
//                            bitmap = FrameFilterUtils.decodeSampledBitmapFromResource(getResources(), resourceID,
//                                Utils.dip2px(60), Utils.dip2px(20));


                            try {
                                // filename是assets目录下的图片名
                                InputStream inputStream = assetManager.open("images/"+url);
                                bitmap = FrameFilterUtils.getReSizeBitmap(BitmapFactory.decodeStream(inputStream), Utils.dip2px(100), Utils.dip2px(100));

                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                        }
                        if (bitmap != null) {
                            Message msg = Message.obtain();
                            msg.what = MSG_MARKS;
                            msg.obj = bitmap;
                            mHandler.sendMessage(msg);
                        }
                    }
                }
                catch (Exception e) {
                    e.printStackTrace();
                    // myEventEmitter.receiveEvent(MyEventEmitter.EVENT_ERROR,null);
                }
            }
        });

    }

    public void initView() {
        content_layout = (RelativeLayout) findViewById(R.id.mainLayout);
        filtersList_layout = (LinearLayout) findViewById(R.id.filtersList);
        bottom_parent_rl = (RelativeLayout) findViewById(R.id.bottom_parent_rl);
        if (scale) {
            bottom_parent_rl.setVisibility(View.VISIBLE);
        }
        else {
            bottom_parent_rl.setVisibility(View.GONE);
        }
        expandBtn = (TextView) findViewById(R.id.expandBtn);
        smallBtn = (TextView) findViewById(R.id.smallBtn);
        btn_ok = (TextView) findViewById(R.id.btn_ok1);
        titleView = (TextView) findViewById(R.id.title);
        orignView = (RaduisImageView) findViewById(R.id.orignview);
        btn_cancel = (TextView) findViewById(R.id.btn_cancel1);
        btn_ok.setOnClickListener(this);
        btn_cancel.setOnClickListener(this);
        orignView.setOnClickListener(this);
        expandBtn.setOnClickListener(this);
        smallBtn.setOnClickListener(this);
    }

    private void fillContent() {
        if (operateView != null) {
            operateView = null;
        }
        Log.v("dyh2",
            "resizeBmp.getWidth():" + resizeBmp.getWidth() + " resizeBmp.getHeight():" + resizeBmp.getHeight());
        operateView = new OperateView(activity, resizeBmp);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(resizeBmp.getWidth(),
            resizeBmp.getHeight());
        operateView.setLayoutParams(layoutParams);
        content_layout.addView(operateView);
        operateView.setMultiAdd(true); // 设置此参数，可以添加多个图片
    }

    // 将模板View的图片转化为Bitmap
    public Bitmap getBitmapByView(View v) {
        Bitmap bitmap = Bitmap.createBitmap(resizeBmp.getWidth(), resizeBmp.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Log.v("dyh", "height:" + Utils.height + " resizeBmp.getHeight(): " + resizeBmp.getHeight()
            + " this.getHeight():" + this.getHeight());
        v.layout((this.getWidth() - resizeBmp.getWidth()) / 2, (this.getHeight() - resizeBmp.getHeight()) / 2,
            resizeBmp.getWidth(), resizeBmp.getHeight());
        v.draw(canvas);
        return bitmap;
    }

    // 将生成的图片保存到内存中
    public String saveBitmap(Bitmap bitmap, String name) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            File dir = new File(Constants.filePath);
            if (!dir.exists()) {
                dir.mkdir();
            }

            File file = new File(Constants.filePath + name + ".jpg");
            try {
                file.createNewFile();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            FileOutputStream out;

            try {
                out = new FileOutputStream(file);
                if (bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)) {
                    out.flush();
                    out.close();
                }
                return file.getAbsolutePath();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

    private void addpic(Bitmap bmp2) {

        Bitmap bmp = FrameFilterUtils.getReSizeBitmap(bmp2, Utils.dip2px(300), Utils.dip2px(300));

//        Bitmap bmp = FrameFilterUtils.decodeSampledBitmapFromBitmap(bmp2, Utils.dip2px(150), Utils.dip2px(150));
        // Bitmap bmp = BitmapFactory.decodeResource(getResources(), position);
        // ImageObject imgObject = operateUtils.getImageObject(bmp);
        ImageObject imgObject = operateUtils.getImageObject(bmp, operateView, 5, 150, 100);
        operateView.addItem(imgObject);
    }

    private void btnSave() {
        operateView.save();
        Bitmap bmp = getBitmapByView(operateView);
        if (bmp != null) {
            mPath = saveBitmap(bmp, "saveTemp_" + System.currentTimeMillis());

            Bitmap bitmap = null;
            try {
                bitmap = FrameFilterUtils.compressForQuality(mPath, 1024);
            }
            catch (Exception e1) {
            }
            String base64 = FrameFilterUtils.bitmapToBase64(bitmap);
            // 事件通知
            WritableMap map = Arguments.createMap();
            map.putString("data", base64);
            map.putString("uri", mPath);
            myEventEmitter.receiveEvent(MyEventEmitter.EVENT_COMPLETE, map);
            fillContent();
            blurSize = 3;
        }

    }

    int j = 0;

    int blurSize = 3;

    @Override
    public void onClick(View v) {
        int i = v.getId();
        if (i == R.id.btn_ok1) {
            btnSave();

        }
        else if (i == R.id.expandBtn) {
            j++;
            Bitmap bmp = FrameFilterUtils.scaled(scaleBitmap, j, true);
            operateView.setBgBmp(bmp);

        }
        else if (i == R.id.smallBtn) {
            j--;
            Bitmap bmp = FrameFilterUtils.scaled(operateView.getBgBmp(), j, false);
            operateView.setBgBmp(bmp);
        }
        else if (i == R.id.btn_cancel1) {
            // 事件通知
            WritableMap map = Arguments.createMap();
            map.putString("result", "ok");
            myEventEmitter.receiveEvent(MyEventEmitter.EVENT_CANCEl, map);

        }
        else if (i == R.id.orignview) {
            /**
             * 可以模糊3次 3次之前的点击则恢复原图
             */
            if (blurSize < 10) {
                blurBmp = FastBlurUtil.toBlur(resizeBmp, blurSize);
                scaleBitmap = blurBmp;
                Log.i("dyh", "毛了" + blurSize);
                operateView.setBgBmp(blurBmp);
                blurSize = blurSize + 3;
            }
            else {
                Log.i("dyh", "切回");
                scaleBitmap = resizeBmp;
                operateView.setBgBmp(resizeBmp);
                blurSize = 3;
            }

            // if (isOrign) {
            // // 宽高减去一半了
            // blurBmp = FastBlurUtil.toBlur(resizeBmp, 3);
            // scaleBitmap = blurBmp;
            // Log.i("dyh", "毛了");
            // operateView.setBgBmp(blurBmp);
            // isOrign = false;
            // }
            // else {
            // Log.i("dyh", "切回");
            // scaleBitmap = resizeBmp;
            // operateView.setBgBmp(resizeBmp);
            // isOrign = true;
            // }

        }
        else {
        }
    }
}
