package hh.dejsem;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

import hh.lib.D;

public class FlatButton extends RelativeLayout {
	/**-------------------------------------------------------------------------
	 * Základem je RelativeLayout jako kontejner
	 * 	- do levého horního rohu se umístí TextView s textem, s paddigem,
	 * 		s defaultním nebo explicitním marginem
	 * 	- na okraje textu (včetně jeho paddingu) se chytne rámeček s kulatými rohy
	 * 		a průhledným pozadím (FrameLayout s vepsaným obdélníkem).
	 *
	 * Poloměr rohů rámečku a padding textu se odvozuje z velikosti fontu.
	 * Barva se přebírá z barvy textu.
	 * Padding vytváří odstup rámečku od textu, margin vytváří odstup vně rámečku
	 * od sousedních views (hlavně od sousedních tlačítek).
	 *
	 * Kontejner, text i rámeček dostávají všechny XML-atributy z nichž se natvrdo přebíjejí
	 *      android:background      průhledným pozadím
	 *      android:gravity         centrováním textu v jeho view
	 *      android:padding...		padding textu se odvozuje z velikosti fontu
	 *
	 * Při vynechání android:text se doplňuje "button"
	 *
	 * Všechny android:layout_margins se vztahují k nadřídené viewGroup.
	 * Margins pro umístění textu v kontejneru se berou z custom name space
	 *      ns:layout_margin            přebíjí default margin stejný na všech stranách
	 *      ns:layout_marginStart       přebíjí margin na jedné straně
	 *      ns:layout_marginTop         přebíjí margin na jedné straně
	 *      ns:layout_marginEnd         přebíjí margin na jedné straně
	 *      ns:layout_marginBottom      přebíjí margin na jedné straně
	 *
	 * Programově lze nastavit
	 *      text            setText(String)
	 *      velikost písma  setTargetSize(float)
	 *      barvu           setColor(int)
	 *      marginStart v kontejneru
	 *                      setMarginStart(int)
	 *      marginEnd v kontejneru
	 *                      setMarginEnd(int)
	 * V <resources> se předpokládá definice styleable-grupy FlatButton
	 *      <declare-styleable name="FlatButton">
	 *          <attr name="android:text"/>
	 *          <attr name="android:background"/>           <-- TODO
	 *          <attr name="layout_margin" format="dimension"/>
	 *          <attr name="layout_marginStart" format="dimension"/>
	 *          <attr name="layout_marginTop" format="dimension"/>
	 *          <attr name="layout_marginEnd" format="dimension"/>
	 *          <attr name="layout_marginBottom" format="dimension"/>
	 *      </declare-styleable>
	 */
	D d;
	static final int WRAP_CONTENT = RelativeLayout.LayoutParams.WRAP_CONTENT;
	TextView t = null;
	Encircle e = null;
	View v = null;                  /* overlay for click */
	float rad;                      /* poloměr rohů */
	final int defaultMargin = 8;	/* margin textu v kontejneru */
	final int textId = android.R.id.text1;
	String text = "button";
	int textPadding = -1, textPaddingStart = -1, textPaddingTop = -1, textPaddingEnd = -1, textPaddingBottom = -1;

	class Encircle extends View {
		String tag;
		final Paint stroke;
		int width = 0, height = 0;

		Encircle(Context c, AttributeSet as) {
			super(c, as);
//			setBackgroundResource(Color.TRANSPARENT);
			setBackgroundResource(android.R.color.transparent);
			stroke = new Paint();
			stroke.setAntiAlias(true);
			stroke.setStyle(Paint.Style.STROKE);
			stroke.setColor(t.getCurrentTextColor());
			stroke.setStrokeWidth(3f);
			if(d.ll(5)) d.l(String.format("text created"));
		}

		public void onDraw(Canvas canvas) {
			canvas.drawRoundRect(new RectF(0, 0, width, height), rad, rad, stroke);
			if(d.ll(5)) d.l(String.format("onDraw: width=%d, height=%d, rad=%activeFragment", width, height, rad));
		}

		protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
			super.onLayout(changed, left, top, right, bottom);
			if(d.ll(5)) d.l(String.format("onLayout: changed=%b, w=%d, h=%d", changed, getWidth(), getHeight()));
			if(changed) {
				width = getWidth();
				height = getHeight();
//				rad = height / 4;
			}
		}
	}

	class Text extends AppCompatTextView {
		String tag;

		Text(Context c, AttributeSet as) {
			super(c, as);
			setId(textId);
			setText(text);
//			Typeface tf = Typeface.create(defaultText, Typeface.NORMAL);
//			setTypeface(tf);
			setGravity(Gravity.CENTER);
			FlatButton.this.setPadding(this);
			setBackgroundResource(android.R.color.transparent);
			if(d.ll(5)) d.l(String.format("text created"));
		}

		public void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			if(d.ll(5)) d.l(String.format("onDraw: w=%d, h=%d", getWidth(), getHeight()));
		}

		protected void onMeasure(int w, int h) {
			super.onMeasure(w, h);
			if(d.ll(5)) d.l(String.format("onMeasure: w=%d, h=%d", w, h));
		}
	}

	public FlatButton(Context c) {
		this(c, null);
	}

	public FlatButton(Context c, AttributeSet as) {
		super(c, as);
		d = new D(c, getClass().getSimpleName() + (getId() == View.NO_ID ? ".xx" : ".id" + getId()));

		int margin = defaultMargin;
		int marginStart = defaultMargin;
		int marginTop = defaultMargin;
		int marginEnd = defaultMargin;
		int marginBottom = defaultMargin;

		if(as != null) {
			TypedArray ta = c.getResources().obtainAttributes(as, R.styleable.FlatButton);
			try {
				if(d.ll(5)) d.l(String.format("android:text has value=%b, hh:text has value=%b",
						ta.hasValue(R.styleable.FlatButton_android_text), ta.hasValue(R.styleable.FlatButton_text)));
				if(ta.hasValue(R.styleable.FlatButton_android_text))
					text = ta.getString(R.styleable.FlatButton_android_text);
				if(ta.hasValue(R.styleable.FlatButton_layout_margin))
					margin = ta.getDimensionPixelOffset(R.styleable.FlatButton_layout_margin, defaultMargin);
				if(ta.hasValue(R.styleable.FlatButton_layout_marginStart))
					marginStart = ta.getDimensionPixelOffset(R.styleable.FlatButton_layout_marginStart, margin);
				else marginStart = margin;
				if(ta.hasValue(R.styleable.FlatButton_layout_marginTop))
					marginTop = ta.getDimensionPixelOffset(R.styleable.FlatButton_layout_marginTop, margin);
				else marginTop = margin;
				if(ta.hasValue(R.styleable.FlatButton_layout_marginEnd))
					marginEnd = ta.getDimensionPixelOffset(R.styleable.FlatButton_layout_marginEnd, margin);
				else marginEnd = margin;
				if(ta.hasValue(R.styleable.FlatButton_layout_marginBottom))
					marginBottom = ta.getDimensionPixelOffset(R.styleable.FlatButton_layout_marginBottom, margin);
				else marginBottom = margin;
				if(d.ll(5)) d.l(String.format("text_padding has value=%b", ta.hasValue(R.styleable.FlatButton_text_padding)));
				textPadding = ta.getDimensionPixelOffset(R.styleable.FlatButton_text_padding, -1);
				if(ta.hasValue(R.styleable.FlatButton_text_paddingStart))
					textPaddingStart = ta.getDimensionPixelOffset(R.styleable.FlatButton_text_paddingStart, -1);
				if(ta.hasValue(R.styleable.FlatButton_text_paddingTop))
					textPaddingTop = ta.getDimensionPixelOffset(R.styleable.FlatButton_text_paddingTop, -1);
				if(ta.hasValue(R.styleable.FlatButton_text_paddingEnd))
					textPaddingEnd = ta.getDimensionPixelOffset(R.styleable.FlatButton_text_paddingEnd, -1);
				if(ta.hasValue(R.styleable.FlatButton_text_paddingBottom))
					textPaddingBottom = ta.getDimensionPixelOffset(R.styleable.FlatButton_text_paddingBottom, -1);
			} finally { ta.recycle(); }
		}

		t = new Text(c, as);
		LayoutParams textLayout = new LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
		textLayout.addRule(ALIGN_PARENT_TOP);
		textLayout.addRule(ALIGN_PARENT_LEFT);
		textLayout.setMargins(marginStart, marginTop, marginEnd, marginBottom);

		e = new Encircle(c, as);
		LayoutParams encircleLayout = new LayoutParams(WRAP_CONTENT, WRAP_CONTENT);
		encircleLayout.addRule(ALIGN_RIGHT, textId);
		encircleLayout.addRule(ALIGN_LEFT, textId);
		encircleLayout.addRule(ALIGN_TOP, textId);
		encircleLayout.addRule(ALIGN_BOTTOM, textId);

		v = new View(c, as);

		addView(e, encircleLayout);
		addView(t, textLayout);
		addView(v, encircleLayout);

		if(d.ll(5)) d.l(String.format("flat button created"));
	}

	void setPadding(TextView t) {
		rad = t.getTextSize() / 3;
		final int defaultPad = textPadding == -1 ? Math.round(rad * 0.7f) : textPadding;
		final int padStart = textPaddingStart == -1 ? defaultPad : textPaddingStart;
		final int padTop = textPaddingTop == -1 ? defaultPad : textPaddingTop;
		final int padEnd = textPaddingEnd == -1 ? defaultPad : textPaddingEnd;
		final int padBottom = textPaddingBottom == -1 ? defaultPad : textPaddingBottom;
		t.setPadding(padStart, padTop, padEnd, padBottom);
		invalidate();
		if(d.ll(5)) d.l(String.format("textPadding=%d, defaultPad=%d, padTop=%d", textPadding, defaultPad, padTop));
	}

	public FlatButton setText(String text) {
		t.setText(text);
		invalidate();
		return this;
	}

	CharSequence getText() { return t.getText(); }

	public FlatButton setSize(float textSize) {
		t.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
		setPadding(t);
		invalidate();
		return this;
	}

	float getSize() { return t.getTextSize(); }

	public FlatButton setColor(int color) {
		if(d.ll(5)) d.l(String.format("setColor=%x", color));
		t.setTextColor(color);
		e.stroke.setColor(color);
		invalidate();
		return this;
	}

	int getColor() { return e.stroke.getColor(); }

	public FlatButton setMarginStart(int margin) {
		LayoutParams lp = (LayoutParams)t.getLayoutParams();
		lp.setMarginStart(margin);
		t.setLayoutParams(lp);
		invalidate();
		return this;
	}

	FlatButton setMarginEnd(int margin) {
		LayoutParams lp = (LayoutParams)t.getLayoutParams();
		lp.setMarginEnd(margin);
		t.setLayoutParams(lp);
		invalidate();
		return this;
	}

	public void setOnClickListener(View.OnClickListener lstnr) {
		v.setOnClickListener(lstnr);
	}

	public void setTag(String tag) { v.setTag(tag); }
}
