package com.nith.appteam.nimbus.CustomView;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;

import com.nith.appteam.nimbus.R;

import java.util.ArrayList;

/**
 * Created by sahil on 9/2/17.
 */

public class EditorView extends ScrollView {
    private static final int EDIT_PADDING_TOP = 10;
    private static final int EDIT_PADDING = 10;

    private LinearLayout allLayout;
    private LayoutInflater inflater;
    private EditText lastEditText;
    private OnFocusChangeListener focusChangeListener;
    private OnKeyListener keyListener;
    private OnClickListener onClickListener;
    private int viewTag = 1;


    public EditorView(Context context) {
        this(context, null);
    }

    public EditorView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EditorView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);


        inflater = LayoutInflater.from(context);

        allLayout = new LinearLayout(context);
        allLayout.setOrientation(LinearLayout.VERTICAL);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        addView(allLayout, layoutParams);

        onClickListener = new OnClickListener() {
            @Override
            public void onClick(View view) {
                allLayout.removeView(view);
            }
        };

        focusChangeListener = new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean b) {
                if (b) {
                    lastEditText = (EditText) view;
                }
            }
        };

        keyListener = new OnKeyListener() {
            @Override
            public boolean onKey(View view, int i, KeyEvent keyEvent) {
                if (keyEvent.getAction() == KeyEvent.ACTION_DOWN && keyEvent.getKeyCode() == KeyEvent.KEYCODE_DEL) {
                    EditText editText = (EditText) view;
                    onBackPress(editText);
                }
                return false;
            }
        };

        EditText e = createEditText("Title", dip2px(10));
        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        allLayout.addView(e, p);

        EditText content = createEditText("Enter Description or Insert Any Image", dip2px(10));
        LinearLayout.LayoutParams contentp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        allLayout.addView(content, contentp
        );
        lastEditText = content;

    }

    private EditText createEditText(String hint, int Padding) {
        EditText editText = (EditText) inflater.inflate(R.layout.item_edittext, null);
        editText.setTag(viewTag++);
        editText.setOnFocusChangeListener(focusChangeListener);
        editText.setOnKeyListener(keyListener);
        editText.setPadding(dip2px(EDIT_PADDING_TOP), Padding, dip2px(EDIT_PADDING_TOP), 0);
        editText.setHint(hint);
        return editText;
    }

    private void createImageViewAtIndex(Bitmap bmp, int index,String imageUrl) {
        RelativeLayout view= (RelativeLayout) inflater.inflate(R.layout.item_image,null);
        EditorImageView imageView= (EditorImageView) view.findViewById(R.id.editorImageView);
        imageView.setImageBitmap(bmp);
        imageView.setAbsoluteUrl(imageUrl);

        int imageHeight = getWidth() * bmp.getHeight() / bmp.getWidth();
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, imageHeight);
        imageView.setLayoutParams(lp);
        view.setOnClickListener(onClickListener);
        allLayout.addView(view, index);
    }

    private void createEditTextAtIndex(String text, int index) {
        EditText e = createEditText("", dip2px(10));
        e.setText(text);
        allLayout.addView(e, index);
    }

    private void onBackPress(EditText editText) {
        int selection = editText.getSelectionStart();
        if (selection == 0) {
            int viewIndex = allLayout.indexOfChild(editText);
            View v = allLayout.getChildAt(viewIndex - 1);

            if (v != null) {
                if (v instanceof EditText) {
                    if ((int) v.getTag() != 1) {
                        String s1 = editText.getText().toString();
                        EditText q = (EditText) v;
                        String s2 = q.getText().toString();
                        allLayout.removeView(editText);
                        q.setText(s1 + s2);
                        q.requestFocus();
                        q.setSelection(s2.length(), s2.length());
                        lastEditText = q;
                    }
                } else if (v instanceof ImageView) {
                    allLayout.removeView(v);
                }

            }
        }

    }

    public void addImage(String filePath){
        addImage(getScaledBitmap(filePath,getWidth()),filePath);
    }

    private void addImage(Bitmap b,String imageUrl) {
        String text1 = lastEditText.getText().toString();
        int pos = lastEditText.getSelectionStart();
        String text2 = text1.substring(0, pos).trim();
        int index = allLayout.indexOfChild(lastEditText);

        if (text1.isEmpty() && (int) lastEditText.getTag() != 1) {
            createImageViewAtIndex(b, index+1,imageUrl);
        } else {
            lastEditText.setText(text2);
            String t = text1.substring(pos).trim();
            if (allLayout.getChildCount() - 1 == index || !t.isEmpty()) {
                createEditTextAtIndex(t, index + 1);
            }
            createImageViewAtIndex(b, index + 1,imageUrl);
            lastEditText.requestFocus();
            lastEditText.setSelection(text2.length(), text2.length());
        }
        hideKeyBoard();
    }

    public void hideKeyBoard() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(lastEditText.getWindowToken(), 0);
    }

    private int dip2px(float dipValue) {
        float m = getContext().getResources().getDisplayMetrics().density;
        return (int) (dipValue * m + 0.5f);
    }

    public AddTopic buildEditData() {
        String topic="",detail="";
        ArrayList<String> imageUrl=new ArrayList<>();

        int num = allLayout.getChildCount();
        for (int index = 0; index < num; index++) {
            View itemView = allLayout.getChildAt(index);
            Log.d("index",""+index);
            if (itemView instanceof EditText) {
                EditText item = (EditText) itemView;
                if (index == 0) {
                    topic=item.getText().toString();
                }
                if (index == 2) {
                    detail=item.getText().toString();
                }
                else if(index==1){
                    detail=item.getText().toString();
                }
            }

            else if (itemView instanceof RelativeLayout) {
                EditorImageView i= (EditorImageView) itemView.findViewById(R.id.editorImageView);
                imageUrl.add(i.getAbsoluteUrl());
            }
        }
        AddTopic itemData = new AddTopic(topic,detail,imageUrl);
        return itemData;
    }

    public class AddTopic{
        public String title,detail;
        public ArrayList<String> imageUrl;

        public AddTopic(String title, String detail, ArrayList<String> imageUrl) {
            this.title = title;
            this.detail = detail;
            this.imageUrl = imageUrl;
        }
    }

    private Bitmap getScaledBitmap(String filePath, int width) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(filePath, options);
        int sampleSize = options.outWidth > width ? options.outWidth / width
                + 1 : 1;
        options.inJustDecodeBounds = false;
        options.inSampleSize = sampleSize;
        return BitmapFactory.decodeFile(filePath, options);
    }
}