#!/usr/bin/python3

import sys
import piexif as x
import datetime as dt

shift = dt.timedelta(hours = 1, minutes = 6)
print('Shift exif date time by', shift)

if len(sys.argv) < 1:
    print(sys.argv[0], 'img1.jpg img2.jpg')
    quit()

def codesOfLabelsContaining(value: str):
    codes = []
    for (k, v) in x.TAGS['Exif'].items():
        if value in v['name']:
            codes.append(k)
    return codes

timeCodes = codesOfLabelsContaining('Time')
dateTimeCodes = codesOfLabelsContaining('DateTime')

filenames = sys.argv[1:]

formatDate = '%Y:%m:%d %H:%M:%S'
formatFrom = f"b'{formatDate}'"


def dateTimeOf(exif):
    for k in dateTimeCodes:
        if k in exif.keys():
            return dt.datetime.strptime(str(exif[k]), formatFrom)
    return dt.datetime.now()


def describeExif(exif):
    for k in timeCodes:
        if k in exif.keys():
            print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name'])
        else:
            print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name'])


def shiftDateTime(exifDict):
    e = exifDict['Exif']
    t = dateTimeOf(e)
    print('Shifting')
    print(t)

    targetDateTime = t + shift
    print('to')
    print(targetDateTime)

    for k in dateTimeCodes:
        e[k] = targetDateTime.strftime(formatDate).encode()

    return exifDict


for filename in filenames:
    print(filename)
    exifDict = x.load(filename)
    describeExif(exifDict['Exif'])
    exifDict = shiftDateTime(exifDict)
    describeExif(exifDict['Exif'])
    exifBytes = x.dump(exifDict)
    x.insert(exifBytes, filename)
    print()