package kz.istt.locust;

//import android.content.Context;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;

import com.google.android.material.textfield.TextInputEditText;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import dbfields.DateInput;
import dbfields.DateTimeText;
import dbfields.DateTimeTM;
import dbfields.SpinnerDB;
import dbfields.AutoCompleteTextViewDB;
import dbfields.StringDB;

/*
 * Соответствие GUI полей и полей базы данных
 * Для сохранения значений и для их загрузки из базы
*/

public class DBGUITable 
{
	private Context m_context;

	//private DbOpenHelper m_dboh;
	//Для списка полей
	private List<Object> m_listO;
	private List<String> m_listN; //Имена столбцов
	private String m_table;

	public DBGUITable(Context context, String table)
	{
		m_context = context;
		m_table = table;
		//m_dboh = dboh;

		m_listO = new ArrayList<Object>();
		m_listN = new ArrayList<String>();
	}

	/**
	 * Получить тип столбца из таблицы
	 * @param name
	 * @return
	 */
	public String getType(String name)
	{
		String type=null;
		//Считываем поля и их типы из таблицы
		DbOpenHelper dboh = new DbOpenHelper(m_context);
		Cursor cursor = dboh.getReadableDatabase().rawQuery("PRAGMA table_info('"+m_table+"');",null);
		if(cursor.moveToFirst())
		{
			do{
				if(Tools.getStringFromCursor(cursor,"name").equals(name))
				{
					type = Tools.getStringFromCursor(cursor,"type");
					break;
				}
			}while (cursor.moveToNext());
		}
		cursor.close();
		dboh.close();
		if(type!=null){
			return type.toLowerCase();
		}else{
			return null;
		}
	}

	/*
	 * Передаётся компонент и название поля таблицы
	*/
	public void add(Object component, String name)
	{
		m_listO.add(component);
		m_listN.add(name);
	}

	/**
	 * Найти компонент по имени поля базы
	 * @param fieldName
	 * @return
	 */
	public Object findComponent(String fieldName)
	{
		for(int i=0;i<m_listN.size();i++)
		{
			if(m_listN.get(i).equals(fieldName)) return m_listO.get(i);
		}
		return null;
	}

	/* Вставить либо обновить запись из GUI элементов
	 * */
	public String write()
	{
		ContentValues cv = new ContentValues();
		for(int i=0;i<m_listO.size();i++)
		{
			String field = m_listN.get(i);
			String value = getValue(m_listO.get(i));
			String type = getType(field);
			if(type==null) {
				Log.e("CCALM", "NOT FIND field = " + m_listN.get(i) + " value = " + value);
				continue;
			}
			Log.e("CCALM", "field = " + m_listN.get(i) + " value = " + value + " type = " + type);
			
			if(type.equals("text"))
			{
				cv.put(field, value);
			}else
			if(type.equals("integer") || type.equals("boolean"))
			{
				Integer val=null;
				if(value!=null) val= Integer.parseInt(value);
				cv.put(field, val);
			}else
			if(type.equals("double") || type.equals("float"))
			{
				Double val=null;
				if(value!=null) val= Double.parseDouble(value);
				cv.put(field, val);
			}else
			{
				Log.e("CCALM", "type= " + type + " = " + value);
			}

		}
		cv.put("send", 0); //Ставим признак не отправленности чтоб запись отправилась по расписанию

		String uid=null;
		//Проверка нужно ли вставить либо обновить по id записи
		boolean b=false;
		DbOpenHelper dboh = new DbOpenHelper(m_context);
		Cursor cursor;
		if(cv.getAsString("uid")!=null)
		{
			uid=cv.getAsString("uid");
			String sql="select 1 from "+m_table+" where uid = '" + uid +"'";
			cursor = dboh.getReadableDatabase().rawQuery(sql,null);
			b=cursor.moveToFirst();
			cursor.close();
		}
		dboh.close();

		if(!b) //Вставляем новую запись
		{
			uid = UUID.randomUUID().toString().replace("-", "");
			cv.put("uid", uid);

			SQLiteDatabase db = dboh.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			try {
				db.insert(m_table, null, cv);
				db.setTransactionSuccessful();
			} finally {
				db.endTransaction();
			}
			db.close();

		}else //Обновить запись
		{
			SQLiteDatabase db = dboh.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			uid=cv.getAsString("uid");
			try {
				db.update(m_table, cv, "uid = ?", new String[] {uid});
				db.setTransactionSuccessful();
			} finally {
				db.endTransaction();
			}
			db.close();
		}
		return uid;
	}

	/** Прочитать значения в GUI поля из базы по id записи
	 */
	public void read(String uid)
	{
		if (uid != null) // Выборка данных для редактирования
		{
			DbOpenHelper dboh = new DbOpenHelper(m_context);

			String sql = "";
			Cursor cursor = null;
			sql = "select * from "+m_table+" where uid='" + uid + "'";

			cursor = dboh.getReadableDatabase().rawQuery(sql, null);

			if (cursor.moveToFirst())
			{
				//перебираем столбцы и вставляем значения в поля
				for(int i=0;i<cursor.getColumnCount();i++)
				{
					Object obj=findComponent(cursor.getColumnName(i));
					if(obj!=null)
					{
						Log.e("CCALM", "1 field " + cursor.getColumnName(i) + " = " + cursor.getString(i) + " type= " + cursor.getType(i));

						if(cursor.getType(i)==2){ //Because cutting double
							setValue(obj, ""+cursor.getDouble(i));
						}else {
							setValue(obj, cursor.getString(i));
						}


						//для проверки обратное дёйствие
						//Log.e("CCALM", "2 field " + cursor.getColumnName(i) + " = " + getValue(findComponent(cursor.getColumnName(i))));
					}
				}
			}
			cursor.close();
			dboh.close();
		}

	}

	//Прочитать значение из GUI объекта "obj"
	public String getValue(Object obj)
	{
		String value = null;
		if(obj!=null)
		{
			if(obj.getClass().toString().indexOf("android.widget.EditText")!=-1) value = ((EditText)obj).getText().toString(); else
			if(obj.getClass().toString().indexOf("android.material.textfield.TextInputEditText")!=-1) value = ((TextInputEditText)obj).getText().toString(); else
			if(obj.getClass().toString().indexOf("android.widget.Spinner")!=-1) value = ((Spinner)obj).getSelectedItem().toString(); else
			if(obj.getClass().toString().indexOf("android.widget.CheckBox")!=-1) value = ((CheckBox)obj).isChecked() ? "1" : "0"; else
			if(obj.getClass().toString().indexOf("java.lang.Integer")!=-1) value = ((Integer)obj).toString(); else
			if(obj.getClass().toString().indexOf("java.lang.String")!=-1) value = ((String)obj); else
			if(obj.getClass().toString().indexOf("dbfields.SpinnerDB")!=-1) value = ((SpinnerDB)obj).getValue(); else
			if(obj.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) value = ((AutoCompleteTextViewDB)obj).getValue(); else
			if(obj.getClass().toString().indexOf("dbfields.StringDB")!=-1) value = ((StringDB)obj).getValue(); else
			if(obj.getClass().toString().indexOf("dbfields.DateTimeTM")!=-1) value = ((DateTimeTM)obj).getValue(); else
			if(obj.getClass().toString().indexOf("dbfields.DateTimeText")!=-1) value = ((DateTimeText)obj).getValue(); else
			if(obj.getClass().toString().indexOf("dbfields.DateInput")!=-1)
			{
				if(((DateInput)obj).getDate()!=null)
					value = ((DateInput)obj).getDate().toString(); //В секундах
			}
		}
		if(value!=null && value.equals("")) value=null;
		return value;
	}

	//Установить значение "value" для GUI объекта "obj"
	public void setValue(Object obj, String value)
	{
		if(obj==null) return;

		//Log.d("igor","getClass = "+obj.getClass().toString());

		if(obj.getClass().toString().indexOf("android.widget.EditText")!=-1) ((EditText)obj).setText(value);
		if(obj.getClass().toString().indexOf("android.material.textfield.TextInputEditText")!=-1) ((TextInputEditText)obj).setText(value);
		if(obj.getClass().toString().indexOf("android.widget.Spinner")!=-1) Tools.selSpinnerIC(((Spinner)obj), value);
		if(obj.getClass().toString().indexOf("android.widget.CheckBox")!=-1) ((CheckBox)obj).setChecked(value.equals("1") ? true : false);
		//if(obj.getClass().toString().indexOf("java.lang.Integer")!=-1) ((Integer)obj)=Integer.parseInt(value); так не работает
		//if(obj.getClass().toString().indexOf("java.lang.String")!=-1) ((String)obj)=value; так не работает
		if(obj.getClass().toString().indexOf("dbfields.SpinnerDB")!=-1) ((SpinnerDB)obj).setValue(value);
		if(obj.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)obj).setValue(value);
		if(obj.getClass().toString().indexOf("dbfields.StringDB")!=-1) ((StringDB)obj).setValue(value);
		if(obj.getClass().toString().indexOf("dbfields.DateTimeTM")!=-1) ((DateTimeTM)obj).setValue(value);
		if(obj.getClass().toString().indexOf("dbfields.DateTimeText")!=-1) ((DateTimeText)obj).setValue(value);
		if(obj.getClass().toString().indexOf("dbfields.DateInput")!=-1)
		{
			if(value==null)
			{	((DateInput)obj).setDate((Date)null);
			}
			else
			{	((DateInput)obj).setDate(Long.parseLong(value));
			}
		}
	}
}
