#!/usr/bin/env perl
use Cwd; $currdir=cwd; 
use threads; use threads::shared; my @tiles:shared;
if (!-d "source_tiles"){mkdir "source_tiles";}
$tileside=4000;
$tilebuffer=2;
$pixelsize=0.00025;

########## Check or modify the path to OSGeo4w.bat and the number of threads
$ogr="C:/Program Files/QGIS 3.34.2/OSGeo4w.bat";
$threads=5;
######################################

########## Check name of the tile list
open (DAT, "tiles.txt") or die "ERROR: no tiles.txt"; @tiles=<DAT>; close (DAT); foreach (@tiles) {chomp;}
######################################

########## Make list of all files to split. <Path>,<outname>
$list="
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2000_model.tif,loss_2000
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2001_model.tif,loss_2001
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2002_model.tif,loss_2002
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2003_model.tif,loss_2003
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2004_model.tif,loss_2004
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2005_model.tif,loss_2005
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2006_model.tif,loss_2006
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2007_model.tif,loss_2007
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2008_model.tif,loss_2008
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2009_model.tif,loss_2009
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2010_model.tif,loss_2010
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2011_model.tif,loss_2011
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2012_model.tif,loss_2012
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2013_model.tif,loss_2013
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2014_model.tif,loss_2014
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2015_model.tif,loss_2015
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2016_model.tif,loss_2016
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2017_model.tif,loss_2017
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2018_model.tif,loss_2018
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2019_model.tif,loss_2019
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2020_model.tif,loss_2020
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2021_model.tif,loss_2021
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2022_model.tif,loss_2022
D:/Mekong_Workspace/03_apply_loss/Forest_loss_2023_model.tif,loss_2023
D:/Mekong_Workspace/04_apply_tcc/TCC_model_1997.tif,TCC_1997
D:/Mekong_Workspace/04_apply_tcc/TCC_model_1998.tif,TCC_1998
D:/Mekong_Workspace/04_apply_tcc/TCC_model_1999.tif,TCC_1999
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2000.tif,TCC_2000
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2001.tif,TCC_2001
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2002.tif,TCC_2002
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2003.tif,TCC_2003
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2004.tif,TCC_2004
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2005.tif,TCC_2005
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2006.tif,TCC_2006
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2007.tif,TCC_2007
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2008.tif,TCC_2008
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2009.tif,TCC_2009
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2010.tif,TCC_2010
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2011.tif,TCC_2011
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2012.tif,TCC_2012
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2013.tif,TCC_2013
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2014.tif,TCC_2014
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2015.tif,TCC_2015
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2016.tif,TCC_2016
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2017.tif,TCC_2017
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2018.tif,TCC_2018
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2019.tif,TCC_2019
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2020.tif,TCC_2020
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2021.tif,TCC_2021
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2022.tif,TCC_2022
D:/Mekong_Workspace/04_apply_tcc/TCC_model_2023.tif,TCC_2023
D:/Mekong_Workspace/05_apply_tch/TCH_model_2000.tif,TCH_2000
D:/Mekong_Workspace/05_apply_tch/TCH_model_2001.tif,TCH_2001
D:/Mekong_Workspace/05_apply_tch/TCH_model_2002.tif,TCH_2002
D:/Mekong_Workspace/05_apply_tch/TCH_model_2003.tif,TCH_2003
D:/Mekong_Workspace/05_apply_tch/TCH_model_2004.tif,TCH_2004
D:/Mekong_Workspace/05_apply_tch/TCH_model_2005.tif,TCH_2005
D:/Mekong_Workspace/05_apply_tch/TCH_model_2006.tif,TCH_2006
D:/Mekong_Workspace/05_apply_tch/TCH_model_2007.tif,TCH_2007
D:/Mekong_Workspace/05_apply_tch/TCH_model_2008.tif,TCH_2008
D:/Mekong_Workspace/05_apply_tch/TCH_model_2009.tif,TCH_2009
D:/Mekong_Workspace/05_apply_tch/TCH_model_2010.tif,TCH_2010
D:/Mekong_Workspace/05_apply_tch/TCH_model_2011.tif,TCH_2011
D:/Mekong_Workspace/05_apply_tch/TCH_model_2012.tif,TCH_2012
D:/Mekong_Workspace/05_apply_tch/TCH_model_2013.tif,TCH_2013
D:/Mekong_Workspace/05_apply_tch/TCH_model_2014.tif,TCH_2014
D:/Mekong_Workspace/05_apply_tch/TCH_model_2015.tif,TCH_2015
D:/Mekong_Workspace/05_apply_tch/TCH_model_2016.tif,TCH_2016
D:/Mekong_Workspace/05_apply_tch/TCH_model_2017.tif,TCH_2017
D:/Mekong_Workspace/05_apply_tch/TCH_model_2018.tif,TCH_2018
D:/Mekong_Workspace/05_apply_tch/TCH_model_2019.tif,TCH_2019
D:/Mekong_Workspace/05_apply_tch/TCH_model_2020.tif,TCH_2020
D:/Mekong_Workspace/05_apply_tch/TCH_model_2021.tif,TCH_2021
D:/Mekong_Workspace/05_apply_tch/TCH_model_2022.tif,TCH_2022
D:/Mekong_Workspace/05_apply_tch/TCH_model_2023.tif,TCH_2023
";
@tasklist=split('\n',$list); shift(@tasklist);

$ogr=~s/\\/\//g;
$taskcount=@tiles;

for($threadID=1;$threadID<=$threads;$threadID++){push @ClassThreads, threads->create(\&Process);} 
foreach $thread (@ClassThreads)  {$thread->join();} @ClassThreads=();

sub Process {
	while ($tile = shift(@tiles)){
		if ($tile eq ""){die;}
		$taskcount2=@tiles; $perc=int(100-$taskcount2/$taskcount*100); print "\r\e[KProcessed:$perc\%\tTile:$tile\t";
		if (!-d "source_tiles/$tile"){mkdir "source_tiles/$tile";}

		open (BAT, ">temp_batch$threadID.bat");
		$x1=substr $tile,0,3; $sx=substr $tile,3,1; if ($sx eq "W"){$centerx=($x1+0.5)*-1;} else {$centerx=$x1+0.5;}
		$y1=substr $tile,5,2; $sy=substr $tile,7,1; if ($sy eq "S"){$centery=($y1+0.5)*-1;} else {$centery=$y1+0.5;}
		$ulxtile=$centerx-0.5-$tilebuffer*$pixelsize;
		$ulytile=$centery+0.5+$tilebuffer*$pixelsize;
		$lrxtile=$centerx+0.5+$tilebuffer*$pixelsize;
		$lrytile=$centery-0.5-$tilebuffer*$pixelsize;
		for $line (@tasklist){
			($source,$output)=split(',',$line);
			if (!-e "source_tiles/$tile/$tile\_$output.tif"){
				print BAT "gdalwarp -te $ulxtile $lrytile $lrxtile $ulytile -tr 0.00025 0.00025 -of GTiff -co COMPRESS=LZW $source source_tiles/$tile/$tile\_$output.tif\n";
			}
		}
		close (BAT);
		readpipe "\"$ogr\" temp_batch$threadID.bat >nul 2>&1";
		sleep(10);
		system "del temp_batch$threadID.bat";
	}
}
