#!/usr/bin/python
'''
Created on 14 mars 2021

@author: loic
'''
from osgeo import gdal, osr, ogr
import argparse, shutil, os, glob


def find_kml_tiles(kmlfile, centro):
    polytiledict={}
    

    driver = ogr.GetDriverByName('LIBKML')
    
    dataSource = driver.Open(kmlfile, 0) # 0 means read-only. 1 means writeable.
    
    # Check to see if shapefile is found.
    if dataSource is None:
        print('Could not open %s' % (kmlfile))
        exit()
    else:
        print('Opened %s' % (kmlfile))
        for layer in dataSource:
            for feature in layer:
                if "PR_" in feature.GetField('Name') or "ICR_" in feature.GetField('Name'):
                    continue
                if feature.geometry().Contains(centro):
                    return feature.GetField('Name').strip()
#                 polytiledict[feature.GetField('Name')]=feature.geometry()
    
#     return polytiledict
    
def read_csv_tilenames(csvfile):
    tilenames=[]
    with open(csvfile) as csvf :
        i=0
        for line in csvf:
#             if i == 0:
#                 i+=1
#                 continue
            if '\n' in line:
                line=line[:-1]
            tilenames.append(line.split(","))
            
    return tilenames

def read_CNB_centroid(img):
    raster = gdal.Open(img)
    proj = osr.SpatialReference(wkt=raster.GetProjection())
    
    upx, xres, xskew, upy, yskew, yres = raster.GetGeoTransform()
    cols = raster.RasterXSize
    rows = raster.RasterYSize

     
    cx = upx + cols*xres/2 + rows*xskew/2
    cy = upy + cols*yskew/2 + rows*yres/2

    
    pointC = ogr.Geometry(ogr.wkbPoint)
    pointC.AddPoint(cx, cy)
    
    if not proj.IsGeographic() :
        
        outSpatialRef = osr.SpatialReference()
        outSpatialRef.ImportFromEPSG(4326)
        coordTransform = osr.CoordinateTransformation(proj, outSpatialRef)
        
        pointC.Transform(coordTransform)
        
    return pointC



if __name__ == '__main__':
    # Make parser object
    parser = argparse.ArgumentParser(description=
        """
        Rename CNBuildings Map with IGN tile for Thisme integration
        """)
    
    parser.add_argument('-indir', action='store', required=True, help='Directory containing CNBuildings maps files')
    parser.add_argument('-inkml', action='store', required=True, help='Airbus tiles in kml')
    parser.add_argument('-inign', action='store', required=True, help='csv file linking airbus to ign tiles names')
    parser.add_argument('-outdir', action='store', required=True, help='Output directory')
    
    
    args=parser.parse_args()
    
    if not os.path.exists(args.outdir):
        os.mkdir(args.outdir)
    
#     print("Reading kml.....")
#     kmls = read_kml_tiles(args.inkml)
    print("Reading tilenames.....")
    igns = read_csv_tilenames(args.inign)
    
    outcsv = os.path.join(args.outdir,"00_renamelog.csv")
    
    sfiles = glob.glob(os.path.join(args.indir,"*.tif"))
    
    basenewname = os.path.join(args.outdir,"BF_SPOT67_")
    renamelist=[]
    
    with open(outcsv,'w') as olog:
        print("Processing.....")
        for f in sfiles:
            print(f+"....")
            spf = os.path.basename(f).split("_")
            fdate = spf[3]
            ndate = fdate[:8]+"T"+fdate[8:-1]
            
            print("... getting centoid")
            pc = read_CNB_centroid(f)
            
            print("... searching kml tile")
#             for key in kmls :
#                 print(key)
#                 print(kmls[key].Centroid().GetX() +"/"+kmls[key].Centroid().GetY())
#                 if kmls[key].Contains(pc) :
            airbustile = find_kml_tiles(args.inkml, pc)
            
            print("... finding tile " +airbustile)
#                     print("... find kml tile "+ key)
#                     tileairbus = key
            tileign = None
            for i in igns:
#                 print(i)
                if i[0] == airbustile :
                    print("... find ign tile "+ i[1])
                    tileign = i[1]
                    break
                
            if tileign == None:
                print("Can't find ign tile for airbus tile "+ airbustile)
                exit()
            
            print("... in memory")
            renamelist.append([f,basenewname+tileign.upper()+"_"+ndate+".TIF"])
            print("... in outcsv")                   
            olog.write(os.path.basename(f)+";"+os.path.basename(basenewname+tileign.upper()+"_"+ndate+".TIF")+"\n")
    
    for r in renamelist:
        shutil.move(r[0], r[1])
            
            
            
    
    