package slite.lib_java.db.cron;

import java.io.File;
import java.util.TreeSet;
import slite.lib_java.Util;
import slite.lib_java.DbCockroach;

public class Cron implements Runnable
{
	public static String baseFolder = "db_crons";
	public static DbCockroach db = new DbCockroach("track");

	File jobFile;
	long sleepTime;

	public Cron(File jobFile, long sleepTime)
	{
		this.jobFile = jobFile;
		this.sleepTime = sleepTime;
		new Thread(this).start();
	}

	public void run()
	{
		out("Started cron on file '"+this.jobFile+"' using interval of "+sleepTime+" seconds");
		while(true)
		{
			try
			{
				Thread.currentThread().sleep(this.sleepTime*1000);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}

			this.runCron();
		}
	}

	public void runCron()
	{
		if(this.jobFile.isDirectory())
		{
			var filesRaw = this.jobFile.listFiles();
			var orderedSet = new TreeSet<String>();
			for (var fileRaw : filesRaw) orderedSet.add(fileRaw.toString());
			for(var file : orderedSet)
			{
				if(file.endsWith(".sql"))
				this.runCronFile(new File(file));
			}
		}
		else
			this.runCronFile(this.jobFile);
	}

	public void runCronFile(File sqlFile)
	{
		try
		{
			var sql = Util.stringFromFile(sqlFile.toString());
			out(sqlFile+" - Starting");
			long time = System.currentTimeMillis();

			for(var envItem : System.getenv().entrySet()) sql = sql.replace("${"+envItem.getKey()+"}",envItem.getValue());

			var result = db.put(sql);
			time = System.currentTimeMillis() - time;
			System.out.println(sqlFile+" - Done ("+time+"ms) - "+result+" rows");
			// System.out.println(result);
		}
		catch(Exception e)
		{
			err(e);
		}
	}

	public static void out(Object message)
	{
		System.out.println(message+"");
	}

	public static void err(Throwable error)
	{
		err(error,null);
	}

	public static void err(Throwable error, Object message)
	{
		if(message!=null) System.err.println(message);
		System.err.println(error);
	}

	public static void startThreads()
	{
		var baseFile = new File(baseFolder);
		var cycleFolders = baseFile.listFiles();
		for(var cycleFolder : cycleFolders)
		{
			try
			{
				if(cycleFolder.isDirectory())
				{
					long sleepTime = Long.parseLong(cycleFolder.getName());
					startThreads(sleepTime, cycleFolder);
				}
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}

	public static void startThreads(long sleepTime, File folder)
	{
		var folders = folder.listFiles();
		for(var job : folders)
		{
			var isCron = false;
			var name = job.getName();

			if(job.isDirectory()) isCron = true;
			if(!isCron && name.endsWith(".sql")) isCron = true;
			if(!isCron) continue;

			new Cron(job, sleepTime);
		}
	}

	public static void main(String[] args)
	{
		baseFolder = Util.envGet("SLITE_LIB_JAVA_DB_CRON_FOLDER",baseFolder);

		startThreads();
	}
}