package dbfields;

import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Editable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import java.util.ArrayList;
import java.util.List;

public class SpinnerDB extends Spinner implements selectDB
{
	private String m_Value = null;
	private List<String> m_lName = new ArrayList<String>(); //Заголовки
	private List<String> m_lVal = new ArrayList<String>(); //Значения
	private Context m_context = null;

	private List<OnClickListener> m_lChange = new ArrayList<OnClickListener>(); //Слушатели изменений

	private OnItemSelectedListener listener =  new OnItemSelectedListener()
	{
		@Override
		public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
		{
			if(getSelectedItemPosition()!=INVALID_POSITION && position != INVALID_POSITION)
				SpinnerDB.this.setValue(m_lVal.get(getSelectedItemPosition()));
		}
		@Override
		public void onNothingSelected(AdapterView<?> parentView)
		{
		}
	};

	/**
	 * Добавить слушателя смены значения (не клика)
	 * @param listener
	 */
	public void addOnChangeValueListener(OnClickListener listener)
	{
		m_lChange.add(listener);
	}

	/**
	 * Удалить слушателя смены значений
	 * @param listener
	 */
	public void remOnChangeValueListener(OnClickListener listener)
	{
		m_lChange.remove(listener);
	}

	public SpinnerDB(Context context, AttributeSet attrs)
	{
		super(context,attrs);
		m_context = context;
		setOnItemSelectedListener(listener);
	}

	/**
	 * Получить значение 
	 */
	public String getValue()
	{
		return m_Value;
	}

	/** Присвоить значение полю и попытаться найти его в выподающем списке*/
	public void setValue(String value)
	{
		if(m_Value == value) return;
		m_Value = value;

		updatePosition();

		//Информируем слушателей о изменении значении
		for(int i=0;i<m_lChange.size();i++)
		{	m_lChange.get(i).onClick(getEmptyView());
		}
	}

	public void addField(String name, String val)
	{
		m_lName.add(name);
		m_lVal.add(val);

		//Обновляем список
		setOnItemSelectedListener(null); //Чтоб событие не сработало
		ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
		dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		this.setAdapter(dataAdapter);
		setOnItemSelectedListener(listener);

		updatePosition(); //Чтоб установилось на существующее значение если оно есть
	}

	public void clearFields()
	{
		m_lName.clear();
		m_lVal.clear();

		//Обновляем список
		setOnItemSelectedListener(null);
		ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(m_context, android.R.layout.simple_spinner_item, m_lName);
		dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		this.setAdapter(dataAdapter);
		setOnItemSelectedListener(listener);
	}

	/**
	 * Обновить позицию вып списка в соответствии со значением
	 */
	protected void updatePosition()
	{
		Boolean b=true;
		for(int i=0;i<m_lVal.size();i++)
		{
			if(m_lVal.get(i).equals(m_Value))
			{
				setSelection(i);
				b=false;
				break;
			}
		}
		if(b) setSelection(INVALID_POSITION);
	}

	// Return the currently selected title (not a value)
	public Editable getText(){
		String result="";
		for(int i=0;i<m_lVal.size();i++)
		{
			if(m_lVal.get(i).equals(m_Value))
			{
				result=m_lName.get(i);
				break;
			}
		}
		return new SpannableStringBuilder(result);
	}

	public void setOnChangeValueListener(View.OnClickListener listener){
		this.addOnChangeValueListener(listener);
	}

	// Класс для сохранения изменений сделаных пользователем при повороте экрана
	public static class SavedStateSPNR extends BaseSavedState
	{
		String value = ""; //Не может быть null почемуто вылетает!

		SavedStateSPNR(Parcelable superState)
		{
			super(superState);
		}

		@Override
		public void writeToParcel(Parcel out, int flags)
		{
			super.writeToParcel(out, flags);
			out.writeString(value);
		}

		public static final Parcelable.Creator<SavedStateSPNR>	CREATOR	= new Parcelable.Creator<SavedStateSPNR>()
																	{
																		public SavedStateSPNR createFromParcel(Parcel in)
																		{
																			return new SavedStateSPNR(in);
																		}

																		public SavedStateSPNR[] newArray(int size)
																		{
																			return new SavedStateSPNR[size];
																		}
																	};

		private SavedStateSPNR(Parcel in)
		{
			super(in);
			value = in.readString();
		}

	}

	@Override
	public Parcelable onSaveInstanceState()
	{
		SavedStateSPNR st = new SavedStateSPNR(super.onSaveInstanceState());
		st.value = getValue();
		if(st.value==null) st.value="";
		return st;
	}

	@Override
	public void onRestoreInstanceState(Parcelable state)
	{
		if (state == null || !(state instanceof SavedStateSPNR))
		{
			super.onRestoreInstanceState(state);
			return;
		}

		SavedStateSPNR ss = (SavedStateSPNR) state;
		super.onRestoreInstanceState(ss.getSuperState());
		setValue(ss.value);
	};

}
