#!/usr/bin/env python

import glob
import os
import re
import sys
import shutil
import importlib
import imp

from efidir.config import *
from efidir.sws import *
from efidir.utils import listimage, envi

def usage():
    print "usage:"
    print "      " + sys.argv[0] + " parameterFile"
    print ""
    print "      paramFile: input parameters file"
    print ""
    print "          parameters file format:"
    print "                   # 0. parameters"
    print "                   inputDir = \"PATH TO INPUT IMAGES\""
    print "                   inputExt = \"IMAGE EXTENSION\""
    print ""
    print "                   # 0.1 Thumbnail sizes on resized images"
    print ""
    print "                   row        = 1st ROW OF THUM"
    print "                   column     = 1st COL OF THUM"
    print "                   nb_rows    = NB ROW OF 1st THUM"
    print "                   nb_columns = NB COL OF 1st THUM"
    print ""
    print "                   # 0.2 Maximum displacement in pixel for correlation of registration step"
    print "                   max_deplacement = MAXIMUM PIXEL DEPLACEMENT FOR REGISTRATION"
    print ""
    print "                   # 0.3 Define the indice of the master image for registation"
    print "                   master_image = 0"
    print ""
    print "                   # 0.4 resize method (\"zeropad\", \"crop\", (\"XYstart\" not yet))"
    print "                   resize_method = \"zeropad\""
    print ""

# check the number of argument"
if len(sys.argv) < 2:
    print "Not enough arguments"
    print "" 
    usage()
    sys.exit()
elif len(sys.argv) > 2:
    print "Not many arguments"
    print "" 
    usage()
    sys.exit()

# 0. Init

# 0.1 get parameters
inputParam = sys.argv[1]
nom_images = []
inputFileOfInputFiles = "images.list"

execfile(inputParam)

# 0.2 Target list to be built
targets = []


# 0.3 Get the list of input image
nom_images = listimage.genListImage(inputDir, inputExt, inputFileOfInputFiles)
nbr_images = len(nom_images)

# 1 Crop imagette
crop_dir = "thumbnail"
crop_list = "images.crop.list"


for nPath in nom_images: 
	n = os.path.basename(nPath)

	outputs = [crop_dir+"/"+n+".crop",
		   crop_dir+"/"+n+".crop.hdr"]

	inputs = [nPath,
		  nPath+".hdr"]
 		
 	
	commands = [
		EFIDIR_PREFIX+"/bin/crop "
		+"  --input "+inputs[0]	 
		+"  --output "+outputs[0]	
		+"  --row "+str(row)
		+"  --column "+str(column) 
		+"  --nb_rows "+str(nb_rows)
		+"  --nb_columns "+str(nb_columns)
		]
	targets.append(target_create(commands, inputs, outputs))

# 2. Convert datatype in float
crop_float_dir = crop_dir+"_float"
crop_float_list = "images_crop_float.list"

for nPath in nom_images: 
	n = os.path.basename(nPath)
	outputs = [crop_float_dir+"/"+n+".crop",
		   crop_float_dir+"/"+n+".crop.hdr"]
	
	inputs = [crop_dir+"/"+n+".crop",
		   crop_dir+"/"+n+".crop.hdr"]
	 		
 	
 	commands = [
 		EFIDIR_PREFIX+"/bin/convert_datatype "
                        +"  --input "+inputs[0]		 
		        +"  --output "+outputs[0]		
		        +"  --output_datatype 4 "	 
	
		]
	targets.append(target_create(commands, inputs, outputs))


# 2.2 Run all tasks of chain
chain = chain_create("register_SAR_part1.mk", targets)
chain_save(chain, "register_SAR_part1.mk")
chain_run(chain)
targets = []

# 2.3 Generate all image list for crop
listimage.genListImage(crop_float_dir, ".crop", crop_float_list)

# 3. Dist_corr
offset_dir = crop_dir+"_offset"
offset_list = "images_offset.list"

window_search_nb_rows = nb_rows
window_search_nb_columns = nb_columns

window_nb_rows = window_search_nb_rows - 2*max_deplacement
window_nb_columns = window_search_nb_columns - 2*max_deplacement


inputs = [crop_float_dir+"/"+crop_float_list]

outputs = [offset_dir+"/"+crop_float_list+".offset"]

commands = [
	EFIDIR_PREFIX+"/bin/dist_corr_series "                        
	+"  --input_file_name "+inputs[0]		 
	+"  --output_suffix .offset" 
	+"  --output_dir "+offset_dir
	+"  --no_master "+str(noMaster)
	+"  --window_nb_rows "+str(window_nb_rows)
	+"  --window_nb_columns "+str(window_nb_columns)	 
	+"  --window_search_nb_rows "+str(window_search_nb_rows)	 
	+"  --window_search_nb_columns "+str(window_search_nb_columns)
	+"  --sub_pixel 0"	 
	+"  --intercorrelation_mode 0",
		EFIDIR_PREFIX+"/bin/statistics_series "
		          +"  --input "+outputs[0]
	]
targets.append(target_create(commands, inputs, outputs))

# must be removed when dist_corr series bug corrected
chain = chain_create("register_SAR_part2.mk", targets)
chain_save(chain, "register_SAR_part2.mk")
chain_run(chain)
targets = []


# 4.1. cal_slc dx
inputs = [offset_dir+"/"+crop_float_list+".offset"]
outputs = [offset_dir+"_dx/"+crop_float_list+".offset.dx"]
commands = [
	EFIDIR_PREFIX+"/bin/cal_slc_series "
	+"  --input "+inputs[0] 
	+"  --output_suffix .dx" 
        +"  --output_dir "+offset_dir+"_dx/"
        +"  --processing 4" 
	]

targets.append(target_create(commands, inputs, outputs))


# 4.1. cal_slc dy
inputs = [offset_dir+"/"+crop_float_list+".offset"]
outputs = [offset_dir+"_dy/"+crop_float_list+".offset.dy"]
commands = [
	EFIDIR_PREFIX+"/bin/cal_slc_series "
	+"  --input "+inputs[0] 
	+"  --output_suffix .dy" 
        +"  --output_dir "+offset_dir+"_dy/"
        +"  --processing 5" 
	]

targets.append(target_create(commands, inputs, outputs))

# 5.  crop black area of distcorr imagette
area_nb_columns = nb_columns
area_nb_rows = nb_rows

black_area_columns = (window_search_nb_columns-1)/2
black_area_rows = (window_search_nb_rows-1)/2
area_nb_columns = nb_columns-2*black_area_columns
area_nb_rows = nb_rows-2*black_area_rows

# 5.1 Crop imagette dx 

inputs = [offset_dir+"_dx/"+crop_float_list+".offset.dx"]
outputs = [offset_dir+"_dx/croped/"+crop_float_list+".offset.dx.crop"]
commands = [
  	EFIDIR_PREFIX+"/bin/crop_series "
                  +"  --input "+inputs[0]	 
                  +"  --output_suffix .crop"
	          +"  --output_dir "+offset_dir+"_dx/croped/"
                  +"  --row "+str(black_area_rows)
                  +"  --column "+str(black_area_columns)
                  +"  --nb_rows "+str(area_nb_rows)
                  +"  --nb_columns "+str(area_nb_columns),
	EFIDIR_PREFIX+"/bin/statistics_series "
	          +"  --input "+outputs[0]
	]
targets.append(target_create(commands, inputs, outputs))

# 5.2 Crop imagette dy 

inputs = [offset_dir+"_dy/"+crop_float_list+".offset.dy"]
outputs = [offset_dir+"_dy/croped/"+crop_float_list+".offset.dy.crop"]
commands = [
  	EFIDIR_PREFIX+"/bin/crop_series "
                  +"  --input "+inputs[0]	 
                  +"  --output_suffix .crop"
	          +"  --output_dir "+offset_dir+"_dy/croped/"
                  +"  --row "+str(black_area_rows)
                  +"  --column "+str(black_area_columns)
                  +"  --nb_rows "+str(area_nb_rows)
                  +"  --nb_columns "+str(area_nb_columns),
	EFIDIR_PREFIX+"/bin/statistics_series "
	          +"  --input "+outputs[0]
	]


targets.append(target_create(commands, inputs, outputs))
chain = chain_create("register_SAR_part3.mk", targets)
chain_save(chain, "register_SAR_part3.mk")
chain_run(chain)
targets = []

# 6. compute POIs
POIsX = []
POIsY = []

for i in range(nbr_images):
    POIsX.append(0)
    POIsY.append(0)

POIsX[noMaster] = row+nb_rows/2
POIsY[noMaster] = column+nb_columns/2

f = open(offset_dir+"_dx/croped/"+crop_float_list+".offset.dx.crop", "r")
i=0
for name in f:
    if(i==noMaster):
        i=i+1
    hdr=envi.readHDR(offset_dir+"_dx/croped/"+name.rstrip("\n")+".hdr")
    POIsX[i] = POIsX[noMaster] + float(hdr["EFIDIR_average_band_0"][1:][:-1])
    i=i+1
f.close()


f = open(offset_dir+"_dy/croped/"+crop_float_list+".offset.dy.crop", "r")
i=0
for name in f:
    if(i==noMaster):
        i=i+1
    hdr=envi.readHDR(offset_dir+"_dy/croped/"+name.rstrip("\n")+".hdr")
    POIsY[i] = POIsY[noMaster] + float(hdr["EFIDIR_average_band_0"][1:][:-1])
    i=i+1
f.close()

offsetX = POIsX[:]
offsetY = POIsY[:]
print(POIsX)
print(POIsY)
offsetX = [POIsX[noMaster] - x for x in offsetX]
offsetY = [POIsY[noMaster] - y for y in offsetY]
print(offsetX)
print(offsetY)

#7 register with zero pad
register_dir = "registered"

for i, nPath in enumerate(nom_images):
    if(i==noMaster):
        hdr=envi.readHDR(nPath+".hdr")
        lines = int(hdr["lines"])
        samples = int(hdr["samples"])
        print(hdr["lines"])

if (resize_method == "zeropad"):

    # set positiv offset
    offsetX = [x - min(offsetX) for x in offsetX]
    offsetY = [y - min(offsetY) for y in offsetY]
    print(offsetX)
    print(offsetY)


    for i, nPath in enumerate(nom_images):
        n = os.path.basename(nPath)
    
        inputs = [nPath,
                  nPath+".hdr"]

        outputs = [register_dir+"/"+n,
                   register_dir+"/"+n+".hdr"]

        commands =  [
            EFIDIR_PREFIX+"/bin/zeropad "
            +"  --input " + inputs[0]
            +"  --output " + outputs[0]
            +"  --ncols " + str(samples + int(max(offsetX)))
            +"  --nrows " + str(lines + int(max(offsetY)))
            +"  --xoff " + str(int(offsetX[i]))
            +"  --yoff " + str(int(offsetY[i]))
            ]
        targets.append(target_create(commands, inputs, outputs))  
  
elif (resize_method == "crop"):

    # compute positiv crop offset
    offsetX = [max(offsetX) - x for x in offsetX]
    offsetY = [max(offsetY) - y for y in offsetY]
    print(offsetX)
    print(offsetY)

    for i, nPath in enumerate(nom_images):
        n = os.path.basename(nPath)
    
        inputs = [nPath,
                  nPath+".hdr"]

        outputs = [register_dir+"/"+n,
                   register_dir+"/"+n+".hdr"]

        commands =  [
            EFIDIR_PREFIX+"/bin/crop "
            +"  --input " + inputs[0]
            +"  --output " + outputs[0]
            +"  --row "+ str(int(offsetY[i]))
            +"  --column "+ str(int(offsetX[i]))
            +"  --nb_columns " + str(samples - int(max(offsetX)))
            +"  --nb_rows " + str(lines - int(max(offsetY)))
            ]
        targets.append(target_create(commands, inputs, outputs)) 
    


chain = chain_create("register_SAR_part4.mk", targets)
chain_save(chain, "register_SAR_part4.mk")
chain_run(chain)
targets = []
