/*
AddressView.java
Copyright (C) 2010  Belledonne Communications, Grenoble, France

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.linphone.ui;

import org.linphone.DialerFragment;
import org.linphone.LinphoneManager.AddressType;
import org.linphone.R;

import android.content.Context;
import android.graphics.Paint;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.EditText;

/**
 * @author Guillaume Beraudo
 * 
 */
public class AddressText extends EditText implements AddressType {

	private String displayedName;
	private Uri pictureUri;
	private Paint mTestPaint;
	private DialerFragment dialer;
	
	public void setPictureUri(Uri uri) {
		pictureUri = uri;
	}

	public Uri getPictureUri() {
		return pictureUri;
	}

	public AddressText(Context context, AttributeSet attrs) {
		super(context, attrs);

		mTestPaint = new Paint();
		mTestPaint.set(this.getPaint());
	}

	public void clearDisplayedName() {
		displayedName = null;
	}

	public String getDisplayedName() {
		return displayedName;
	}

	public void setContactAddress(String uri, String displayedName) {
		setText(uri);
		this.displayedName = displayedName;
	}

	public void setDisplayedName(String displayedName) {
		this.displayedName = displayedName;
	}
	
	private String getHintText() {
		String resizedText = getContext().getString(R.string.address_bar_hint);
		if (getHint() != null) {
			resizedText = getHint().toString();
		}
		return resizedText;
	}

	@Override
	protected void onTextChanged(CharSequence text, int start, int before,
			int after) {
		clearDisplayedName();
		pictureUri = null;

		refitText(getWidth(), getHeight());
		
		if (dialer != null) {
			dialer.enableDisableAddContact();
		}

		super.onTextChanged(text, start, before, after);
	}

	@Override
	protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
		if (width != oldWidth) {
			refitText(getWidth(), getHeight());
		}
	}
	
	private float getOptimizedTextSize(String text, int textWidth, int textHeight) {
		int targetWidth = textWidth - getPaddingLeft() - getPaddingRight();
		int targetHeight = textHeight - getPaddingTop() - getPaddingBottom();
		float hi = 90;
		float lo = 2;
		final float threshold = 0.5f;

		mTestPaint.set(getPaint());

		while ((hi - lo) > threshold) {
			float size = (hi + lo) / 2;
			mTestPaint.setTextSize(size);
			if (mTestPaint.measureText(text) >= targetWidth || size >= targetHeight) {
				hi = size;
			}
			else {
				lo = size;
			}
		}
		
		return lo;
	}

	private void refitText(int textWidth, int textHeight) {
		if (textWidth <= 0) {
			return;
		}
		
		float size = getOptimizedTextSize(getHintText(), textWidth, textHeight);
		float entrySize = getOptimizedTextSize(getText().toString(), textWidth, textHeight);
		if (entrySize < size)
			size = entrySize;
		setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
	}

	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
		int height = getMeasuredHeight();
		
		refitText(parentWidth, height);
		setMeasuredDimension(parentWidth, height);
	}

	public void setDialerFragment(DialerFragment dialerFragment) {
		dialer = dialerFragment;
	}
}