package com.kit.widget.wheel.demo;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import com.kit.extend.widget.R;
import com.kit.ui.BaseActivity;
import com.kit.utils.DateUtils;
import com.kit.utils.ZogUtils;
import com.kit.widget.wheel.OnWheelChangedListener;
import com.kit.widget.wheel.WheelConstant;
import com.kit.widget.wheel.WheelView;
import com.kit.widget.wheel.adapters.ArrayWheelAdapter;
import com.kit.widget.wheel.adapters.NumericWheelAdapter;

import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.TextView;

public class YearMonthDayHourMinuteActivity extends BaseActivity implements
		OnClickListener {
	private WheelView year;
	private WheelView month;
	private WheelView day;

	private WheelView hours;
	private WheelView mins;
	private WheelView ampm;

	private int yearIndex, monthIndex, dayIndex;

	private int curYear, curMonth, curDay, curHour, curMinute;

	private OnWheelChangedListener listener;
	// 偏移量为上下10年
	private int offset4year = 10;
	private long dateLong;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.wheel_year_month_day_hour_minute_layout);
		findViewById(R.id.wheel_view_outside).setOnClickListener(this);

		listener = new OnWheelChangedListener() {
			public void onChanged(WheelView wheel, int oldValue, int newValue) {

				yearIndex = year.getCurrentItem();
				monthIndex = month.getCurrentItem();
				dayIndex = day.getCurrentItem();

				curHour = hours.getCurrentItem();
				curMinute = mins.getCurrentItem();

				updateDays(year, month, day);
			}
		};
		sethm();

		setymd();

	}

	@Override
	public boolean getExtra() {
		try {
			Bundle bundle = getIntent().getExtras();

			dateLong = bundle.getLong(WheelConstant.WHEEL_EXTRAS_KEY_DATE_LONG);

		} catch (Exception e) {
			ZogUtils.showException(e);
		}
		return super.getExtra();
	}

	@Override
	protected void onStart() {
		WindowManager m = getWindowManager();
		Display d = m.getDefaultDisplay(); // 为获取屏幕宽、高

		//System.out.println("d.getHeight():" + d.getHeight());
		LayoutParams p = getWindow().getAttributes(); // 获取对话框当前的参数值
		p.height = (int) (d.getHeight() * 1.0); // 高度设置为屏幕的1.0
		p.width = (int) (d.getWidth() * 1.0); // 宽度设置为屏幕的0.8
		p.alpha = 1.0f; // 设置本身透明度
		p.dimAmount = 0.0f; // 设置黑暗度

		getWindow().setAttributes(p); // 设置生效
		getWindow().setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); // 设置靠右对齐
		super.onStart();
	}

	private void sethm() {
		hours = (WheelView) findViewById(R.id.hour);
		NumericWheelAdapter hourAdapter = new NumericWheelAdapter(this, 0, 23);
		hourAdapter.setItemResource(R.layout.wheel_text_item);
		hourAdapter.setItemTextResource(R.id.text);
		hours.setViewAdapter(hourAdapter);

		mins = (WheelView) findViewById(R.id.mins);
		NumericWheelAdapter minAdapter = new NumericWheelAdapter(this, 0, 59,
				"%02d");
		minAdapter.setItemResource(R.layout.wheel_text_item);
		minAdapter.setItemTextResource(R.id.text);
		mins.setViewAdapter(minAdapter);
		mins.setCyclic(true);

		ampm = (WheelView) findViewById(R.id.ampm);
		ArrayWheelAdapter<String> ampmAdapter = new ArrayWheelAdapter<String>(
				this, new String[] { "AM", "PM" });
		ampmAdapter.setItemResource(R.layout.wheel_text_item);
		ampmAdapter.setItemTextResource(R.id.text);
		ampm.setViewAdapter(ampmAdapter);

		// set current time
		Calendar calendar = Calendar.getInstance(Locale.CHINA);
		// 24hour
		hours.setCurrentItem(calendar.get(Calendar.HOUR_OF_DAY));
		// 12hour
		// hours.setCurrentItem(calendar.get(Calendar.HOUR));

		mins.setCurrentItem(calendar.get(Calendar.MINUTE));
		ampm.setCurrentItem(calendar.get(Calendar.AM_PM));

		hours.addChangingListener(listener);
		mins.addChangingListener(listener);
		ampm.addChangingListener(listener);
	}

	private void setymd() {
		year = (WheelView) findViewById(R.id.year);
		month = (WheelView) findViewById(R.id.month);
		day = (WheelView) findViewById(R.id.day);

		Calendar calendar;
		if (dateLong != 0) {
			// 如果上一个activity传过来的有时间日期
			Date date = DateUtils.getDateFormLong(dateLong);
			calendar = Calendar.getInstance();
			calendar.setTime(date);
		} else {
			calendar = Calendar.getInstance(Locale.CHINA);
		}

		// month
		curMonth = calendar.get(Calendar.MONTH);

		// String months[] = new String[] { "January", "February", "March",
		// "April", "May", "June", "July", "August", "September",
		// "October", "November", "December" };
		String months[] = new String[] { "1", "2", "3", "4", "5", "6", "7",
				"8", "9", "10", "11", "12" };
		month.setViewAdapter(new DateArrayAdapter(this, months, curMonth));
		month.setCurrentItem(curMonth);
		month.addChangingListener(listener);

		// year
		curYear = calendar.get(Calendar.YEAR);
		// 偏移量为上下10年
		offset4year = 10;
		year.setViewAdapter(new DateNumericAdapter(this, curYear - offset4year,
				curYear + offset4year, offset4year));
		year.addChangingListener(listener);
		year.setCurrentItem(offset4year);

		// day
		updateDays(year, month, day);
		day.addChangingListener(listener);
		day.setCurrentItem(calendar.get(Calendar.DAY_OF_MONTH) - 1);
	}

	/**
	 * Updates day wheel. Sets max days according to selected month and year
	 */
	void updateDays(WheelView year, WheelView month, WheelView day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR,
				calendar.get(Calendar.YEAR) + year.getCurrentItem());
		calendar.set(Calendar.MONTH, month.getCurrentItem());

		int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar
				.get(Calendar.DAY_OF_MONTH) - 1));
		curDay = Math.min(maxDays, day.getCurrentItem() + 1);
		day.setCurrentItem(curDay - 1, true);
	}

	/**
	 * Adapter for numeric wheels. Highlights the current value.
	 */
	private class DateNumericAdapter extends NumericWheelAdapter {
		// Index of current item
		int currentItem;
		// Index of item to be highlighted
		int currentValue;

		/**
		 * Constructor
		 */
		public DateNumericAdapter(Context context, int minValue, int maxValue,
				int current) {
			super(context, minValue, maxValue);
			this.currentValue = current;
			setTextSize(16);
		}

		@Override
		protected void configureTextView(TextView view) {
			super.configureTextView(view);
			if (currentItem == currentValue) {
				view.setTextColor(0xFF0000F0);
			}
			view.setTypeface(Typeface.SANS_SERIF);
		}

		@Override
		public View getItem(int index, View cachedView, ViewGroup parent) {
			currentItem = index;
			return super.getItem(index, cachedView, parent);
		}
	}

	/**
	 * Adapter for string based wheel. Highlights the current value.
	 */
	private class DateArrayAdapter extends ArrayWheelAdapter<String> {
		// Index of current item
		int currentItem;
		// Index of item to be highlighted
		int currentValue;

		/**
		 * Constructor
		 */
		public DateArrayAdapter(Context context, String[] items, int current) {
			super(context, items);
			this.currentValue = current;
			setTextSize(16);
		}

		@Override
		protected void configureTextView(TextView view) {
			super.configureTextView(view);

			if (currentItem == currentValue) {
				view.setTextColor(0xFF0000F0);
			}
			view.setTypeface(Typeface.SANS_SERIF);
		}

		@Override
		public View getItem(int index, View cachedView, ViewGroup parent) {
			currentItem = index;
			return super.getItem(index, cachedView, parent);
		}
	}

	@Override
	public void onClick(View view) {
		int id = view.getId();
		if (id == R.id.wheel_view_outside) {

			String yearStr = (curYear - offset4year + yearIndex) + "";
			String monthStr = (monthIndex + 1) + "";
			String dayStr = (curDay) + "";

			String hourStr = (curHour) + "";
			String minuteStr = (curMinute) + "";

			ZogUtils.printLog(getClass(), yearStr + "-" + monthStr + "-"
                    + dayStr + " " + hourStr + ":" + minuteStr);

			Intent intent = new Intent();
			String timeString = yearStr + "-" + monthStr + "-" + dayStr + " "
					+ hourStr + ":" + minuteStr;

			Bundle bundle = new Bundle();
			dateLong = DateUtils.getDate2Long(timeString,
					WheelConstant.WHEEL_YEAR_MONTH_DAY_HOUR_MINUTE);

			intent.putExtra("timeString", timeString);
			bundle.putLong(WheelConstant.WHEEL_EXTRAS_KEY_DATE_LONG, dateLong);

			intent.putExtras(bundle);
			setResult(RESULT_OK, intent);

			finish();
		}
	}
}