#**********************************************************************
# PPK(Post Processing Kinematic) Tool for Insta One XX & Airdata csv file
#
# Authors:Hiroyuki Yamada, Ryusuke Sugawara, Toru Suzuki, Takatoshi Nakamura and Kantaro Tabiraki
#**********************************************************************

import csv
import glob
import pyexiv2
import datetime
import cv2
import os
import tkinter as tk
from tkinter import ttk
from tkinter import filedialog

import shutil

### 単位変換・タイムラグ補正 ###
def latlon(coordvalue):
    lon = float(coordvalue)
    cdeg = int(lon)
    lon_1 = (lon - cdeg) * 60
    cmin = int(lon_1)
    csec = int((lon_1 -cmin) * 60 * (10**6))
    return "{}/1 {}/1 {}/1000000".format(cdeg,cmin,csec)

def tlag(logtime):
    jpn_time = datetime.datetime(int(logtime[:4]), int(logtime[5:7]), int(logtime[8:10]),int(logtime[11:13]),int(logtime[14:16]),int(logtime[17:19]))
    utc_time = jpn_time - datetime.timedelta(hours=9)
    logtime = utc_time.strftime('%Y:%m:%d %H:%M:%S')
    return logtime

def feet2meter(feet):
    meter = round(float(feet) * 3048)
    digit = 10 ** (len(str(meter))-1)
    return "{}/{}".format(meter,digit)

def direction(deg):
    deg = int(float(deg) * 10)
    return "{}/10".format(deg)

class PPKTool:
    def __init__(self):
        self.TIK = {}
        self.root = tk.Tk()
        self.entry1 = tk.StringVar()
        self.entry2 = tk.StringVar()
        self.entry3 = tk.StringVar()
        self.setup_gui()

    def setup_gui(self):
        self.root.title("PPK EXIF Rewrite Tool")
        
        # GUIのウィジェットを設定
        ttk.Label(self.root, text="Original jpg Folder:", padding=10).grid(row=0, column=0, sticky=tk.E)
        ttk.Entry(self.root, textvariable=self.entry1, width=30).grid(row=0, column=1)
        ttk.Button(self.root, text="Browse", command=self.dirdialog_clicked1).grid(row=0, column=2)

        ttk.Label(self.root, text="Airdata csv folder:", padding=10).grid(row=1, column=0)
        ttk.Entry(self.root, textvariable=self.entry2, width=30).grid(row=1, column=1)
        ttk.Button(self.root, text="Browse", command=self.dirdialog_clicked2).grid(row=1, column=2)

        ttk.Label(self.root, text="Save jpg folder:", padding=10).grid(row=2, column=0)
        ttk.Entry(self.root, textvariable=self.entry3, width=30).grid(row=2, column=1)
        ttk.Button(self.root, text="Browse", command=self.dirdialog_clicked3).grid(row=2, column=2)

        ttk.Button(self.root, text="Execute", command=self.conductMain).grid(row=3, column=0)
        ttk.Button(self.root, text="Close", command=self.close_window).grid(row=3, column=1)

        self.root.mainloop()

    def dirdialog_clicked1(self):
        iDir1 = os.path.abspath(os.path.dirname(__file__))
        iDirPath1 = filedialog.askdirectory(initialdir=iDir1)
        self.entry1.set(iDirPath1)

    def dirdialog_clicked2(self):
        iDir2 = os.path.abspath(os.path.dirname(__file__))
        iDirPath2 = filedialog.askdirectory(initialdir=iDir2)
        self.entry2.set(iDirPath2)

    def dirdialog_clicked3(self):
        iDir3 = os.path.abspath(os.path.dirname(__file__))
        iDirPath3 = filedialog.askdirectory(initialdir=iDir3)
        self.entry3.set(iDirPath3)

    def close_window(self):
        self.root.destroy()

    def conductMain(self):
        dirPath1 = self.entry1.get()
        dirPath2 = self.entry2.get()
        dirPath3 = self.entry3.get()
        print('Original jpg Folder: ' + dirPath1)
        print('Airdata csv folder: ' + dirPath2)
        print('Save jpg folder: ' + dirPath3)

        ### csv読込・日時緯度経度高度データ処理 ###
        TIK = {}
        csv_path = dirPath2
        csv_files = glob.glob(csv_path + '/*.csv')
        for csv_file in csv_files:
            with open(csv_file, newline='', encoding='utf-8_sig') as f:
                reader = csv.reader(f)
                data = next(reader)
        
                for _ in reader:
                    try:
                        data = next(reader)
                        data[1] = data[1][:4] + ':' + data[1][5:7] + ':' + data[1][8:]
                        TIK[data[1]] = [latlon(data[2]), latlon(data[3]), feet2meter(data[4]), direction(data[22])] 
                    except StopIteration:
                        pass
            f.close()

        ### jpgExifデータ読込・書換 ###
        jpg_path = dirPath1
        jpg_files = glob.glob(jpg_path + '/*.jpg')
        
        for jpg_file in jpg_files:
            
            njpg_file = os.path.join(dirPath3, os.path.basename(jpg_file))
            shutil.copyfile(jpg_file, njpg_file)
            
            img = pyexiv2.Image(njpg_file) 
            gps_data = img.read_exif()
            print(gps_data)
            
            ### jpgタイトル修正 ###
            gps_data['Exif.Image.ImageDescription'] = os.path.basename(jpg_file)

            ### jpgExif読込 ###
            name_date = tlag(gps_data['Exif.Image.DateTime'])
            img.modify_exif({'Exif.Image.Orientation': '1'}) 
            gps_data['Exif.GPSInfo.GPSLatitudeRef'] = 'N'
            gps_data['Exif.GPSInfo.GPSLongitudeRef'] = 'E'
            
            ### jpgExif・フライトログ照合・書換 ###
            if TIK.get(name_date) != None:
                gps_data['Exif.GPSInfo.GPSLatitude'] = TIK[name_date][0]   
                gps_data['Exif.GPSInfo.GPSLongitude'] = TIK[name_date][1]
                gps_data['Exif.GPSInfo.GPSAltitude'] = TIK[name_date][2]
                gps_data['Exif.GPSInfo.GPSImgDirection'] = TIK[name_date][3]
                
                print(".", end="")

            imgcv = cv2.imread(njpg_file)
            img_flip = cv2.flip(imgcv, -1)
            cv2.imwrite(njpg_file, img_flip, [cv2.IMWRITE_JPEG_QUALITY, 95]) #jpg圧縮率を変更する場合は、”95”の数値を変更

            img.modify_exif(gps_data)
            img.close()

        print("\n")
        print("Operation Complete")

if __name__ == "__main__":
    ppk_tool = PPKTool()




