package dbfields;

import android.content.Context;
import android.database.Cursor;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.InputType;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

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

import kz.istt.locust.DbOpenHelper;
import kz.istt.locust.LocustActivity;
import kz.istt.locust.R;

import static android.widget.AdapterView.INVALID_POSITION;

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

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

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

        @Override
        public void onNothingSelected(AdapterView<?> parentView) {
        }
    };*/

    private AdapterView.OnItemClickListener listener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            int pos=getSelectedItemPosition();
            String val=m_lVal.get(pos);
            AutoCompleteTextViewDB.this.setValue(val);
        }
    };

    int getSelectedItemPosition() {
        String str = this.getText().toString();
        int pos=INVALID_POSITION;
        for(int i=0; i<m_lName.size();i++)
        {
            if(str.equals(m_lName.get(i).toString())) {
                pos = i;
                break;
            }
        }
        return pos;
    }
    /**
     * Добавить слушателя смены значения (не клика)
     * @param listener
     */
    public void addOnChangeValueListener(OnClickListener listener)
    {
        m_lChange.add(listener);
    }

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

    /*Консткукто*/
    public AutoCompleteTextViewDB(Context context, AttributeSet attrs)
    {
        super(context,attrs);
        m_context=context;
        //setOnItemSelectedListener(listener);
        setOnItemClickListener(listener);
        setInputType(InputType.TYPE_NULL); //Disable writing to field
    }

    /**
     * Получить значение
     */
    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(this);
        }
    }

    /*public String getText(){
        //
    }*/

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

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

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

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

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

    public void updateAdapter(Context context){
        //Обновляем список
        setOnItemClickListener(null);
        dataAdapter = new ArrayAdapter<String>(context, R.layout.dropdown_item, m_lName);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        this.setAdapter(dataAdapter);
        setOnItemClickListener(listener);
    }


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

        updateAdapter(m_context);
    }

    public void setOnChangeValueListener(View.OnClickListener listener){
        this.addOnChangeValueListener(listener);
    }
/*
    // Класс для сохранения изменений сделаных пользователем при повороте экрана
    public static class SavedState extends BaseSavedState
    {
        String value = ""; //Не может быть null почемуто вылетает!

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

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

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

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

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

    }

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

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

        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());
        setValue(ss.value);
    };
*/
}
