package kz.istt.locust;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings.Secure;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
import com.google.android.gms.common.GooglePlayServicesRepairableException;
import com.google.android.gms.security.ProviderInstaller;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.net.ssl.SSLContext;

import tctable.Point;
import tctable.TCTable;

public class MainActivity extends Activity {
	
	private Button btnSetup;
	private Button btnLocust;
	private Button btnLocustDel;
	private Button btnLocustHealth;
	private TextView tvAndroidID;
	private TextView tvCountTasks;

	private Timer timer = new Timer();

	private static final int PERMISSION_REQUEST_CODE = 0;

	public int g_button=0;

	private final Handler handler = new Handler();
	private final Runnable runnable = new Runnable() {
		@Override
		public void run() {

			//Если в справочнике нет ни одной записи то перезапускаем синхронизацию (иначе отображаем главное меню)
			boolean exists=false;
			DbOpenHelper dboh = new DbOpenHelper(MainActivity.this);
			SQLiteDatabase rdb = null;
			Cursor cursor=null;
			try {
				rdb = dboh.getReadableDatabase();
				cursor = rdb.rawQuery("select c.id from borns c limit 1;", null);
				if (cursor.moveToFirst())
				{
					do
					{
						exists=true;
					} while (cursor.moveToNext());
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(cursor!=null){cursor.close();}
				if(rdb!=null){ rdb.close(); }
			}
			dboh.close();

			if(!exists) {
				startService(new Intent(MainActivity.this, MainService.class).putExtra(MainService.PARAM_ACTION, "1"));
			}else {
				LinearLayout pBar = (LinearLayout)findViewById(R.id.pBar);
				pBar.setVisibility(View.GONE);
				LinearLayout form = (LinearLayout)findViewById(R.id.form);
				form.setVisibility(View.VISIBLE);
			}

			handler.postDelayed(this, 1000*10); // Раз в 10 секунду
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//Так как старые планшеты не работают с HTTPS нормально делаем этот патч
		try {
			// Google Play will install latest OpenSSL
			ProviderInstaller.installIfNeeded(getApplicationContext());
			SSLContext sslContext;
			sslContext = SSLContext.getInstance("TLSv1.2");
			sslContext.init(null, null, null);
			sslContext.createSSLEngine();
		} catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException
				| NoSuchAlgorithmException | KeyManagementException e) {
			//e.printStackTrace();
			Log.e("CCALM", "Error: ", e);
		}

		//Загрузка сохранёного языка
		Tools.loadLocale(this);

		DbOpenHelper dboh = new DbOpenHelper(MainActivity.this);;
		//Перебираем и удаляем фото файлы названия которых нет в базе данных!
		SQLiteDatabase rdb = null;
		try {
			rdb = dboh.getReadableDatabase();

			File directory = new File(Environment.getExternalStorageDirectory() + File.separator + "Pictures" + File.separator + "Locust");
			directory.mkdirs();
			File[] files = directory.listFiles();
			if(files!=null) {
				for (int i = 0; i < files.length; i++) {
					String fileName = files[i].getName();
					if (fileName.charAt(0) == '_')
						fileName = fileName.substring(1); //Чтобы не реагировало на "_"

					boolean exest = false;
					String sql;

					Cursor cursor=null;
					try {
						sql = "select 1 from frmlocust where image_name1='" + fileName + "' or image_name2='" + fileName + "' or image_name3='" + fileName + "';";
						cursor = rdb.rawQuery(sql, null);
						if (cursor.moveToFirst())
							exest = exest | true;
					}catch(Exception e){
						e.printStackTrace();;
					}finally{
						cursor.close();
					}

					cursor=null;
					try {
						sql = "select 1 from frmlocustdel where image_name1='" + fileName + "' or image_name2='" + fileName + "' or image_name3='" + fileName + "';";
						cursor = rdb.rawQuery(sql, null);
						if (cursor.moveToFirst())
							exest = exest | true;
					}catch(Exception e){
						e.printStackTrace();;
					}finally{
						cursor.close();
					}


					if (!exest) //Если в базе нет удаляем
					{
						files[i].delete();
					}
				}
			}

			//Проверяю есть ли в безе записи и вставляю только если их нет
			/* теперь в базу не переписываю так как всё храниться в файлах
			boolean exest = false;
			String sql = "select 1 from CountriesRegionsPoints limit 1;";
			Cursor cursor = db.rawQuery(sql, null);
			if (cursor.moveToFirst())
				exest = true;
			cursor.close();
			if(!exest) {
				//Переписываю координаты из файла в базу данных
				try {
					InputStream isRaw = null;
					isRaw = getResources().openRawResource(R.raw.points);
					if (isRaw != null) {
						TCTable tbl = new TCTable("", 0);
						if (tbl.OpenTableH(isRaw)) {
							dboh.insertTable(tbl);
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}*/
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(rdb!=null){ rdb.close(); }
		}
        dboh.close();

		tvCountTasks = (TextView) findViewById(R.id.tvCountTasks);

		//Запуск службы синхронизации
		startService(new Intent(this,MainService.class).putExtra(MainService.PARAM_ACTION, "1"));

		//Кнопка вызова формы настроек
		btnSetup = (Button) findViewById(R.id.btnSetup);
		OnClickListener oclBtnSetup = new OnClickListener(){@Override
        public void onClick(View v){ onGetPermissions(4); }};
		btnSetup.setOnClickListener(oclBtnSetup);

		//Кнопка вызова формы
		btnLocust = (Button) findViewById(R.id.btnLocust);
		OnClickListener oclBtnLocust = new OnClickListener(){@Override
        public void onClick(View v){ onGetPermissions(1); }};
		btnLocust.setOnClickListener(oclBtnLocust);

		//Кнопка вызова формы
		btnLocustDel = (Button) findViewById(R.id.btnLocustDel);
		OnClickListener oclBtnLocustDel = new OnClickListener(){@Override
        public void onClick(View v){ onGetPermissions(2); }};
		btnLocustDel.setOnClickListener(oclBtnLocustDel);

		btnLocustHealth = (Button) findViewById(R.id.btnLocustHealth);
		OnClickListener oclBtnLocustHealth = new OnClickListener(){@Override
		public void onClick(View v){ onGetPermissions(3); }};
		btnLocustHealth.setOnClickListener(oclBtnLocustHealth);

		tvAndroidID = (TextView) findViewById(R.id.tvAndroidID);
		String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
		tvAndroidID.setText(android_id);
		
		//Версия программы
		try {
			((TextView) findViewById(R.id.tvVersion)).setText("v "+this.getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName);
		} catch (NameNotFoundException e) {
			//e.printStackTrace();
			Log.e("CCALM", "Error: ", e);
		}
/*
		LinearLayout pBar = (LinearLayout)findViewById(R.id.pBar);
		pBar.setVisibility(View.GONE);
		LinearLayout form = (LinearLayout)findViewById(R.id.form);
		form.setVisibility(View.VISIBLE);
*/

		//Для синхронизации справочников
		handler.post(runnable); // Начинаем выполнение задачи
	}

	//Запрашиваю разрешения сдесь хотя GPS на другой форме использую
	public void onGetPermissions(int button)
	{
		g_button = button;

		boolean granted=false;
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

			List<String> list = new ArrayList<String>();

			if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
				list.add(Manifest.permission.ACCESS_COARSE_LOCATION);
			}
			if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
				list.add(Manifest.permission.ACCESS_FINE_LOCATION);
			}
			if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
				list.add(Manifest.permission.CAMERA);
			}
			if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2){
				if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
					list.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
				}
				if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
					list.add(Manifest.permission.READ_EXTERNAL_STORAGE);
				}
			}

			if(!list.isEmpty())
			{
				ActivityCompat.requestPermissions(MainActivity.this,list.toArray(new String[list.size()]),PERMISSION_REQUEST_CODE);
				granted=false;
			}else
			{
				granted=true;
			}
		}else
		{
			granted=true;
		}

		if(granted && button==1)
		{
			ShowLocustActivity();
		}
		if(granted && button==2)
		{
			ShowLocustDelActivity();
		}
		if(granted && button==3)
		{
			ShowLocustHealthActivity();
		}
		if(granted && button==4)
		{
			ShowSetupActivity();;
		}
	}

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        if (requestCode == PERMISSION_REQUEST_CODE) {

			boolean grant=true;
        	for(int i=0;i<grantResults.length;i++)
			{
				grant = grant && grantResults[i] == PackageManager.PERMISSION_GRANTED;
			}
            if(grant) {

				if(g_button==1)
				{
					ShowLocustActivity();
				}
				if(g_button==2)
				{
					ShowLocustDelActivity();
				}
				if(g_button==3)
				{
					ShowSetupActivity();
				}
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	public void ShowSetupActivity()
	{
		Intent intent = new Intent(this, SetupActivity.class);
		startActivity(intent);
	}
	
	public void ShowLocustActivity()
	{
		//_translations
	    Intent intent = new Intent(this, LocustListActivity.class);
	    startActivity(intent);		
	}

	public void ShowLocustHealthActivity()
	{
		Intent intent = new Intent(this, LocustHealthListActivity.class);
		startActivity(intent);
	}

	public void ShowLocustDelActivity()
	{
		//_translations
	    Intent intent = new Intent(this, LocustDelListActivity.class);
	    startActivity(intent);		
	}

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
    	switch (item.getItemId()) 
    	{
    		case R.id.itemSettings: //Создание карточки
		
    			ShowSetupActivity();
    		    
    			break;
    		default:
    			return false;
    	}
    	return true;
    }

    /** СМ. http://developer.android.com/reference/android/app/Activity.html
     * Происходит при старте и при возврате на этот Activity
     * */
	@Override
	public void onStart()
	{
		super.onStart();

		//Для возможности синхронизации прогресс бара передаём ниточку в поток
		PendingIntent pi = createPendingResult(SetupActivity.TASK1_CODE, new Intent(this, MainService.class), 0);
		Intent intent = new Intent(this, MainService.class);
		intent.putExtra(MainService.PARAM_ACTION, "2");
		intent.putExtra(SetupActivity.PARAM_PINTENT, pi);
		startService(intent);
	}

	@Override
	protected void onStop() {
		super.onStop();
/*
		с начала стартует новое окно а потом удаляется старое поэтому без списка не работает
		//Удаляем слушателя
		Intent intent = new Intent(this, MainService.class);
		intent.putExtra(MainService.PARAM_ACTION, "3");
		startService(intent);
*/
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		super.onActivityResult(requestCode, resultCode, data);
		//Пришли данные о статусе синхронизации
		if (resultCode == SetupActivity.STATUS_FINISH)
		{
			int cnt = data.getIntExtra(SetupActivity.PARAM_RESULT, 0);
			tvCountTasks.setText("Synchronization tasks: "+ String.valueOf(cnt));
		}
	}
}
