#!/bin/sh
# vim:set ts=4 ai wm=0 syntax=awk:
#
# (c) Tomwsz R Surmacz
# Skrypt poprawiający odwzorowanie/narożniki (a czasem nazwę) map
# kalibracyjnych serii 1cd.

if [ $# -lt 1 ]; then
	echo "Usage: $0 m-xx-yy-z.map"
	exit 1;
else
	name=$1;
fi

if [ ! -f "$name" ]; then
	echo "Cannot open $name";
	exit 2;
fi

sname=`echo "$name" | sed 's/.map$//'`
mv "$name" "$sname".bak

if [ ! -f "$sname".bak ]; then
	echo "cos nie tak - backup"
	exit 3;
fi

cat "$sname".bak | dos2unix | awk -F, '
BEGIN {
	fname="'"$name"'";
	#margines dodawany/odejmowany od punktów kalibracji, by uzyskać punkty ramki
	margin=15;
	# drive="D:\\ts\\ozi\\Maps\\100k\\";
	drive="";
	marX[1]=-margin; marX[2]= margin; marX[3]= margin; marX[4]=-margin;
	marY[1]=-margin; marY[2]=-margin; marY[3]= margin; marY[4]= margin;
}

function gridsetup () {
	GridSetup=1;
	printf("LL Grid Setup\n");
	printf("LLGRID,No,1 Min,Yes,255,16711680,0,1 Min,0,16777215,8,1,Yes,x\n");
}

/^OziExplorer/ { # nagłówek
	print $0;

	getline;	# M-33-34+35.jpg Wroclaw-Wschod
	# można by tylko wtedy, gdy w nazwie w mapie nie ma spacji:
	mname=fname;
	# sub(/([mn]-[0-9]*-[0-9]*-[a-d])-(.*)/, "\1 \2", mname);
##	mname=gensub(/([- A-Za-z_]*)([MNmn])[-_ ]*(3[34])[^0-9]*(1?[0-9]?[0-9])[-+]?([^0-9]*)[-+]?(1?[0-9]?[0-9])[.]?(bmp|jpg|[- _])?(.*)/, "\\2\\3-\\4-\\6-\\1\\8", 1, substr(fname, 1, 1) "" tolower(substr(fname, 2)));
	sub(/.(map|bak)$/, "", mname);
	printf("Changing %s -> %s\n", fname, mname) >> "/dev/stderr";
	# oraz wszystkie spacje na początku, końcu i w środku:
	gsub(/ *$/, "", mname);
	gsub(/^ */, "", mname);
	gsub(/ /, "_", mname);
	printf("mv -i \"%s\" %s.map\n", fname, mname) >> "mv-all";
	pmname=mname;	# to, które pójdzie do nazwy

	printf("Change0 %s,%s,%s\n", $0, mname, pmname) >> "/dev/stderr";
#	if (index($0, " ")<=3) {
#		gsub(/.jpg /, " ", $0);
#		gsub(/.bmp /, " ", $0);
#		pmname=mname " " $0;
#		printf("Change1 %s -> %s\n", mname, pmname) >> "/dev/stderr";
#
#	} else {
		printf("Change2: %s %s\n", $0, pmname) >> "/dev/stderr";
		if (pmname ~ /[mn]-?[0-9]*-[0-9]*-[0-9]*-[-A-Za-z_]*/) {
			pmname=gensub(/([0-9])-([A-Za-z]*)$/, "\\1 \\2", 1, pmname);
			printf("Change2 %s -> %s\n", mname, pmname) >> "/dev/stderr";
		}
#	}
	printf("%s\n", pmname);

	jname=substr(fname,1,1) "" tolower(substr(fname,2));
	i=match(jname, /[mnMN]-?3[34]/);
	if (i>0) {
		# jname[i]=toupper(jname[i]);
		uname=substr(jname, 1, i-1) "" toupper(substr(jname, i,1)) "" substr(jname, i+1);
		jname=uname;
		sub(/.(map|bak)$/, ".jpg", jname);
		sub(/_bmp/, "", jname);
	    printf("  mv -i \"%s\"  %s.jpg\n", jname, mname) >> "mv-all";
	} else {
		printf("# mv -i \"%s\"  %s.jpg\n", jname, mname) >> "mv-all";
	}
	
	getline;	# Q:\m-33-35-c.jpg
	n=split($0, tb, /[\\:]/);
	#printf("%s%s\n", drive, tb[n]);
	printf("%s%s.jpg\n", drive, mname);
	getline; # 1 , Map Code
	print $0;
	getline; # WGS...
	printf("Pulkovo 1942 (2),WGS 84,   0.0000,   0.0000,WGS 84\n");

	next;
}

/^Point0[1379]/ {	# Poprawianie narożników mapy - na razie zapamiętujemy dane
	x=$3;
	y=$4;
	if ( x<800 && y<800 ) { pt=1; } else
	if ( x>=800 && y<800 ) { pt=2; } else
	if ( x>=800 && y>=800 ) { pt=3; } else
	{ pt=4; }

	# w mapach 100k kalibracja jest wg 9 punktów, rozmieszczonych:
	#  1  2  3
	#  4  5  6
	#  7  8  9
	# Powyższy schemat zadziała także dla numerowania wzdłuż kolumn

	# narożniki mapy zawsze są numerowane w kierunku:  12
	# więc trzeba dostosować się bez względu na        43
	# kolejność numerowania punktów kalibracji.

	pttabX[pt]=x;
	pttabY[pt]=y;
	pttabLatD[pt]=$7;
	pttabLatM[pt]=$8;
	pttabLonD[pt]=$10;
	pttabLonM[pt]=$11;
	print $0;
	# printf("##DEBUG: %s %s %s %s\n", pttabLatD[pt], pttabLatM[pt], pttabLonD[pt], pttabLonM[pt]);
	next;
}

/Map Projection/ { # Odwzorowanie merkatora
	printf("Map Projection,Transverse Mercator,PolyCal,No,AutoCalOnly,No,BSBUseWPX,No\n");
	next;
}

/Projection Setup/ { # parametry odwzorowania - osobne dla arkuszy 33 i 34
	if (mname ~ /[mnMN]33/) {
		falseE="35";
		central="15";
	} else {
		falseE="45";
		central="21";
	}
	printf("Projection Setup,     0.000000000,    %s.000000000,     1.000000000,      %s00000.00,            0.00,,,,,\n", central, falseE);
	next;
}

/LL Grid Setup/ {
	getline;
	gridsetup();
	next;
}

/^MMPXY/ { # Poprawienie narożników
	pt=$2+0;
	printf("MMPXY,%d,%d,%d\n", pt, pttabX[pt]+marX[pt], pttabY[pt]+marY[pt]);
	next;
}

/^MMPLL/ { # Oraz współrzędnych związanych z narożnikami
	pt=$2+0;

	# najpierw wyliczamy ile wynosi poprawka na margines w skali mapy:
	# larmar na przeciwny znak niż powinien:
	lonmar=0.0+pttabX[2]-pttabX[1]+pttabX[3]-pttabX[4]; # długość ramek X
	latmar=0.0+pttabY[4]-pttabY[1]+pttabY[3]-pttabY[2]; # długość ramek Y
	# printf("DEBUG: %d/%f %d/%f (%d)", marX[pt],lonmar, marY[pt],latmar, pt);
	latmar=marY[pt]*.33333/latmar;	# margin*(10/60)/(latmar/2)
	lonmar=marX[pt]*.25/lonmar;		# margin*(15/60)/(lonmar/2)

	# po czym wyliczamy współrzędne punktów kalibracyjnych + poprawka
	lon=0.0+pttabLonM[pt];
	lon=lon/60+pttabLonD[pt]+lonmar;
	lat=0.0+pttabLatM[pt];
	lat=lat/60+pttabLatD[pt]-latmar;
	printf("MMPLL,%d,  %2.6f,  %2.6f\n", pt, lon, lat);
	next;
}

/^MOP,/ {
	if (GridSetup<1) {
		gridsetup();
	}
}

END {
	if (GridSetup<1) {
		gridsetup();
	}
}

{
	print $0;
}
' | unix2dos > $name
ls -l "$sname".bak "$name"
echo diff "$sname".bak "$name"
