package com.fxn769;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by akshay on 15/12/17.
 */

public class Numpad extends FrameLayout implements View.OnClickListener {
    private Context context;
    private ArrayList<TextView> num = new ArrayList<>();
    private ArrayList<ImageView> line = new ArrayList<>();
    private String digits = "";
    private int TextLengthLimit = 6;
    private float TextSize = 12;
    private int TextColor = Color.BLACK;
    private int BackgroundResource = R.drawable.numpad_background;
    private int ImageResource = R.drawable.ic_backspace;
    private boolean GridVisible = true;
    private int GridBackgroundColor = Color.GRAY;
    private int GridThickness = 3;
    private String FontFaceString = "";
    private String CommaString = "";
    private Typeface typeface;
    private ImageView delete;
    private TextView comma;
    private FrameLayout delete_layout;
    private TextGetListner textGetListner;

    public Numpad(@NonNull Context context) {
        super(context);
        initialise(context, null);
    }

    public Numpad(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initialise(context, attrs);
    }

    public Numpad(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initialise(context, attrs);
    }

    public Numpad setOnTextChangeListner(TextGetListner textGetListner) {
        this.textGetListner = textGetListner;
        setup();
        return this;
    }

    public Numpad setBackgroundRes(int BackgroundResource) {
        this.BackgroundResource = BackgroundResource;
        setup();
        return Numpad.this;
    }

    public Numpad setImageRes(int ImageResource) {
        this.ImageResource = ImageResource;
        setup();
        return Numpad.this;
    }

    public Numpad setFontFace(String FontFaceString) {
        this.FontFaceString = FontFaceString;
        typeface = Typeface.createFromAsset(context.getAssets(), this.FontFaceString);
        setup();
        return this;
    }

    private void initialise(Context context, AttributeSet attrs) {
        this.context = context;
        TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Numpad, 0, 0);
        digits = attributes.getString(R.styleable.Numpad_numpad_digits);
        TextLengthLimit = attributes.getInt(R.styleable.Numpad_numpad_text_limit, 5);
        TextSize = attributes.getDimension(R.styleable.Numpad_numpad_text_size, 12.0f);
        TextColor = attributes.getColor(R.styleable.Numpad_numpad_text_color, Color.BLACK);
        BackgroundResource = attributes.getResourceId(R.styleable.Numpad_numpad_background_resource, R.drawable.numpad_background);
        ImageResource = attributes.getResourceId(R.styleable.Numpad_numpad_image_resource, R.drawable.ic_backspace);
        GridVisible = attributes.getBoolean(R.styleable.Numpad_numpad_grid_visible, false);
        GridBackgroundColor = attributes.getColor(R.styleable.Numpad_numpad_grid_background_color, Color.GRAY);
        GridThickness = (int) attributes.getDimension(R.styleable.Numpad_numpad_grid_line_thickness, 3);
        FontFaceString = attributes.getString(R.styleable.Numpad_numpad_fontpath);
        CommaString = attributes.getString(R.styleable.Numpad_numpad_comma);
        if (digits == null) {
            digits = "";
        }

        final View v = LayoutInflater.from(context).inflate(R.layout.numlock_view, this, false);
        num.add((TextView) v.findViewById(R.id.one));
        num.add((TextView) v.findViewById(R.id.two));
        num.add((TextView) v.findViewById(R.id.three));
        num.add((TextView) v.findViewById(R.id.four));
        num.add((TextView) v.findViewById(R.id.five));
        num.add((TextView) v.findViewById(R.id.six));
        num.add((TextView) v.findViewById(R.id.seven));
        num.add((TextView) v.findViewById(R.id.eight));
        num.add((TextView) v.findViewById(R.id.nine));
        num.add((TextView) v.findViewById(R.id.zero));
        line.add((ImageView) v.findViewById(R.id.line1));
        line.add((ImageView) v.findViewById(R.id.line2));
        line.add((ImageView) v.findViewById(R.id.line3));
        line.add((ImageView) v.findViewById(R.id.line4));
        line.add((ImageView) v.findViewById(R.id.line5));
        line.add((ImageView) v.findViewById(R.id.line6));
        line.add((ImageView) v.findViewById(R.id.line7));
        line.add((ImageView) v.findViewById(R.id.line8));
        line.add((ImageView) v.findViewById(R.id.line9));
        line.add((ImageView) v.findViewById(R.id.line10));
        line.add((ImageView) v.findViewById(R.id.line11));
        comma = v.findViewById(R.id.comma);
        delete = v.findViewById(R.id.delete);
        delete_layout = v.findViewById(R.id.delete_layout);
        if (FontFaceString == null) {
            typeface = Typeface.DEFAULT;
        } else {
            typeface = Typeface.createFromAsset(context.getAssets(), FontFaceString);
        }
        setup();
        addView(v);
    }

    private void setup() {

        for (TextView textView : num) {
            textView.setOnClickListener(this);
            textView.setTextSize(TextSize);
            textView.setTextColor(TextColor);
            textView.setBackgroundResource(BackgroundResource);
            textView.setTypeface(typeface);
        }

        if (GridVisible) {
            for (ImageView imageView : line) {
                imageView.setVisibility(VISIBLE);
                imageView.setBackgroundColor(GridBackgroundColor);
            }
            line.get(0).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(1).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(2).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(3).setLayoutParams(new LinearLayout.LayoutParams(GridThickness, LayoutParams.MATCH_PARENT));
            line.get(4).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(5).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(6).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(7).setLayoutParams(new LinearLayout.LayoutParams(GridThickness, LayoutParams.MATCH_PARENT));
            line.get(8).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(9).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
            line.get(10).setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, GridThickness));
        }

        delete_layout.setOnClickListener(this);
        delete_layout.setBackgroundResource(BackgroundResource);
        delete.setImageResource(ImageResource);

        if (CommaString != null) {
            comma.setText(CommaString);
            comma.setOnClickListener(this);
            comma.setTextSize(TextSize);
            comma.setTextColor(TextColor);
            comma.setBackgroundResource(BackgroundResource);
            comma.setTypeface(typeface);
        }
    }

    public String getDigits() {
        return digits;
    }
    
    public void clearDigits() {
        digits="";
    }

    public int getTextLengthLimit() {
        return TextLengthLimit;
    }

    public Numpad setTextLengthLimit(int TextLengthLimit) {
        this.TextLengthLimit = TextLengthLimit;
        setup();
        return this;
    }

    public float getTextSize() {
        return TextSize;
    }

    public Numpad setTextSize(int TextSize) {
        this.TextSize = TextSize;
        setup();
        return this;
    }

    public int getTextColor() {
        return TextColor;
    }

    public Numpad setTextColor(int TextColor) {
        this.TextColor = TextColor;
        setup();
        return this;
    }

    public int getBackgroundResource() {
        return BackgroundResource;
    }

    public int getImageResource() {
        return ImageResource;
    }

    public boolean isGridVisible() {
        return GridVisible;
    }

    public Numpad setGridVisible(boolean GridVisible) {
        this.GridVisible = GridVisible;
        setup();
        return Numpad.this;
    }

    public int getGridBackgroundColor() {
        return GridBackgroundColor;
    }

    public Numpad setGridBackgroundColor(int GridBackgroundColor) {
        this.GridBackgroundColor = GridBackgroundColor;
        setup();
        return Numpad.this;
    }

    public int getGridThickness() {
        return GridThickness;
    }

    public Numpad setGridThickness(int GridThickness) {
        this.GridThickness = GridThickness;
        setup();
        return Numpad.this;
    }

    public Typeface getTypeface() {
        return typeface;
    }

    public ImageView getImageResourceView() {
        return delete;
    }

    public TextGetListner getTextGetListner() {
        return textGetListner;
    }

    @Override
    public void onClick(final View view) {

        if (view instanceof TextView && digits.length() < TextLengthLimit) {
            digits += ((TextView) view).getText();
        } else if (view instanceof FrameLayout && digits.length() >= 1) {
            digits = digits.substring(0, digits.length() - 1);
        }
        textGetListner.onTextChange(digits, TextLengthLimit - digits.length());
    }


}