package lcf.clock;

import java.lang.reflect.Method;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import android.widget.TextView;

public abstract class Style { // all data in pixels. not scaled
	private static Typeface mFont = null;
	private static DisplayMetrics mMetrics = null;
	private final static float FONT_LINE_SPACING = 1.5f;
	private final static String FONT_NAME = "S7.ttf";
	private static final float FONT_KOEF = 0.80f; // Coefficient to fit size in sp to px
	private static final float FONT_TARGET_ASPECT_RATIO = 0.5859375f;

	public static final String CHAR_CODE_DEGREE = "\u00b0";
	public static final String CHAR_CODE_MINUTE = "\u0027";
	public static final String CHAR_CODE_ALARM = "\u23f0";
	public static final String CHAR_CODE_AM = "\u23f2";
	public static final String CHAR_CODE_PM = "\u23f3";
	public static final String CHAR_CODE_SHORT_ONE = "\u23f4";
	public static final String CHAR_CODE_CLOUD = "\u2601";
	public static final String CHAR_CODE_HUMIDITY = "\u23f1";
	public static final String CHAR_CODE_PRECIPTATION = "\u26C6";
	public static final String CHAR_CODE_TEMPERATURE = "\u23f5";
	public static final String CHAR_CODE_BAROMETER = "\u23f6";
	public static final String CHAR_CODE_WIND = "\u23f7";
	public static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	private static int timeFontSizeWSeconds;
	private static int timeFontSizeWOSeconds;

	@SuppressLint("NewApi")
	protected static void init(Context context) {
		if (mFont == null) {
			mFont = Typeface.createFromAsset(context.getAssets(), FONT_NAME);
		}

		mMetrics = context.getResources().getDisplayMetrics();

		if (android.os.Build.VERSION.SDK_INT >= 13) {
			Display dp = ((WindowManager) context
					.getSystemService(Context.WINDOW_SERVICE))
					.getDefaultDisplay();

			if (android.os.Build.VERSION.SDK_INT <= 16) {

				try {
					Method mGetRawW = Display.class.getMethod("getRawWidth");
					Method mGetRawH = Display.class.getMethod("getRawHeight");
					mMetrics.widthPixels = (Integer) mGetRawW.invoke(dp);
					mMetrics.heightPixels = (Integer) mGetRawH.invoke(dp);
				} catch (Exception e) {
				}
			} else if (android.os.Build.VERSION.SDK_INT > 16) {
				Point out = new Point();
				dp.getRealSize(out);
				mMetrics.widthPixels = out.x;
				mMetrics.heightPixels = out.y;
			}
		}
	}

	public static DisplayMetrics getDisplayMetrics() {
		return mMetrics;
	}

	public static void applyWeatherView(WeatherView view, float height) {
		view.setTypeface(mFont, FONT_LINE_SPACING);
		view.setSize((int) height);
	}

	public static void applyTextsView(TextView textView, float height) {
		textView.setTypeface(mFont);
		textView.setTextSize(PxToSp(height));
		textView.setSingleLine(true);
		textView.setIncludeFontPadding(false);
	}

	public static void adjustFontSizeForWidth(TextView textView,
			String pattern, int maxWidth) {
		Rect r = new Rect();
		float size = textView.getTextSize();
		do {
			textView.setTextSize(size / mMetrics.scaledDensity);
			textView.getPaint().getTextBounds(pattern, 0, pattern.length(), r);
		} while (size-- > 0.0f && maxWidth <= r.width());

	}

	public static String splitTextForWidth(TextPaint paint, String text,
			int width, int maxLines) {
		String result = "";
		String[] descr = text.split(" ");
		int lines = 0;
		int used = 0;
		Rect tmp = new Rect();
		int i;
		for (i = 0; i < descr.length; i++) {
			paint.getTextBounds(descr[i], 0, descr[i].length(), tmp);
			if (used + tmp.width() < width) {
				result += (used == 0 ? "" : " ") + descr[i];
				used += tmp.width();
			} else {
				result += Style.LINE_SEPARATOR;
				lines++;
				used = 0;
				i--;
				if (lines >= maxLines) {
					break;
				}
			}
		}
		if (i < descr.length) {
			result += "..";
		}
		return result;
	}

	private static int getTimeViewSuitableFontSize(TextView timeView,
			int startsize, int width) {
		int size = startsize;
		int measuredResult;
		String measuredString = timeView.getText().toString();
		int measuredStringLength = measuredString.length();
		do {
			size++;
			timeView.setTextSize(size);
			measuredResult = timeView.getPaint().breakText(measuredString,
					true, width, null);
		} while (measuredStringLength <= measuredResult);
		size--;
		return size;
	}

	private static void applyTimeViewExcludeSize(TextView timeView) {
		timeView.setTypeface(mFont);
		timeView.setPadding(0, 0, 0, 0);
		timeView.setSingleLine(true);
		timeView.setIncludeFontPadding(false);
	}

	public static void applyTimeViewForPrefs(TextView timeView, int width) {
		applyTimeViewExcludeSize(timeView);

		TimeViewUpdater.printCurrentTime(timeView, true, false);

		timeView.setTextSize(getTimeViewSuitableFontSize(timeView, 1, width));
	}

	public static float applyTimeView(TextView timeView) { // return lefts pixels on screen height
		applyTimeViewExcludeSize(timeView);

		TimeViewUpdater.printCurrentTime(timeView, true, true);

		timeFontSizeWSeconds = getTimeViewSuitableFontSize(timeView, 1,
				mMetrics.widthPixels);

		TimeViewUpdater.printCurrentTime(timeView, true, false);
		timeFontSizeWOSeconds = getTimeViewSuitableFontSize(timeView,
				timeFontSizeWSeconds, mMetrics.widthPixels);

		timeView.setTextSize(timeFontSizeWOSeconds);
		/*Log.i("tag", "!!!!!!!!!! "
				+ (mMetrics.heightPixels - size * mMetrics.scaledDensity
						* mMetrics.density));*/

		Rect r = new Rect();
		timeView.getPaint().getTextBounds(timeView.getText().toString(), 0,
				timeView.getText().length(), r);
		return (mMetrics.heightPixels - r.height());

		//timeFontSizeWOSeconds* mMetrics.scaledDensity * mMetrics.density);
	}

	public static float PxToSp(float size) {
		return size / mMetrics.scaledDensity / FONT_KOEF;
	}

	public static float SpToPx(float size) {
		return size * mMetrics.scaledDensity * FONT_KOEF;
	}

	public static int getTimeFontSizeWSeconds() {
		return timeFontSizeWSeconds;
	}

	public static int getTimeFontSizeWOSeconds() {
		return timeFontSizeWOSeconds;
	}

	public static float getScreenAspectRatioViewsCoeficient() {
		float a = mMetrics.heightPixels;
		float b = mMetrics.widthPixels;
		float r = (float) Math.pow(a / b / FONT_TARGET_ASPECT_RATIO, 1.5f);
		if (r < 1.0f) {
			r = 1.0f;
		}
		return r;
	}
}