#!/usr/bin/env python
# exiftouch -- update JPEG file modification time from Exif 'Date Original'
import argparse
import datetime
import exif
import os
from pprint import pprint
import re

def get_time_exif(path):
    def parse_dt(dt):
        return datetime.datetime.strptime(dt, "%Y:%m:%d %H:%M:%S").astimezone()

    with open(path, "rb") as fh:
        try:
            img = exif.Image(fh)
        except Exception as e:
            print(f"{path}: not an EXIF compatible format")
            return None

    try:
        return parse_dt(img.datetime_original)
    except AttributeError:
        try:
            print(f"{path}: has no datetime_original, try datetime")
            return parse_dt(img.datetime)
        except AttributeError:
            print(f"{path}: EXIF data has no datetime")
            return None
    except KeyError:
        print(f"{path}: has no EXIF data")
        return None

def get_time_filename(path):
    name = os.path.basename(path)
    # Accept new PXL filenames with milliseconds.
    if m := re.match(r"^(IMG|PXL)_([0-9]{8}_[0-9]{6})([0-9]{3})?[._]", name):
        return datetime.datetime.strptime(m.group(2), "%Y%m%d_%H%M%S").astimezone()

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("file", nargs="+")
args = parser.parse_args()

for path in args.file:
    tm = get_time_exif(path)
    if not tm:
        tm = get_time_filename(path)
        if tm:
            print(f"{path}: using file name as fallback")
    if not tm:
        continue

    if args.verbose:
        print(f"{tm} {path}")
    atime = int(datetime.datetime.now().timestamp())
    mtime = int(tm.timestamp())
    os.utime(path, times=(atime, mtime))
    if args.verbose:
        pass
        #print(repr(img.datetime), type(img.datetime))
        #print(img.gps_datestamp, img.gps_timestamp)
