package com.lemenzo.gallery.editor;

import android.content.ContentResolver;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;

import java.io.InputStream;

/** Copies user-relevant EXIF metadata to edited copies without copying stale orientation/dimension tags. */
public final class EditorMetadata {
    private static final String TAG = "LemenzoGalleryExif";

    private static final String[] PRESERVED_TAGS = {
            ExifInterface.TAG_MAKE,
            ExifInterface.TAG_MODEL,
            ExifInterface.TAG_SOFTWARE,
            ExifInterface.TAG_DATETIME,
            ExifInterface.TAG_DATETIME_ORIGINAL,
            ExifInterface.TAG_DATETIME_DIGITIZED,
            ExifInterface.TAG_SUBSEC_TIME,
            ExifInterface.TAG_SUBSEC_TIME_ORIGINAL,
            ExifInterface.TAG_SUBSEC_TIME_DIGITIZED,
            ExifInterface.TAG_OFFSET_TIME,
            ExifInterface.TAG_OFFSET_TIME_ORIGINAL,
            ExifInterface.TAG_OFFSET_TIME_DIGITIZED,
            ExifInterface.TAG_EXPOSURE_TIME,
            ExifInterface.TAG_F_NUMBER,
            ExifInterface.TAG_ISO_SPEED_RATINGS,
            "PhotographicSensitivity",
            ExifInterface.TAG_FOCAL_LENGTH,
            ExifInterface.TAG_FOCAL_LENGTH_IN_35MM_FILM,
            "LensMake",
            "LensModel",
            ExifInterface.TAG_WHITE_BALANCE,
            ExifInterface.TAG_EXPOSURE_BIAS_VALUE,
            ExifInterface.TAG_EXPOSURE_MODE,
            ExifInterface.TAG_EXPOSURE_PROGRAM,
            ExifInterface.TAG_METERING_MODE,
            ExifInterface.TAG_FLASH,
            ExifInterface.TAG_GPS_LATITUDE,
            ExifInterface.TAG_GPS_LATITUDE_REF,
            ExifInterface.TAG_GPS_LONGITUDE,
            ExifInterface.TAG_GPS_LONGITUDE_REF,
            ExifInterface.TAG_GPS_ALTITUDE,
            ExifInterface.TAG_GPS_ALTITUDE_REF,
            ExifInterface.TAG_GPS_TIMESTAMP,
            ExifInterface.TAG_GPS_DATESTAMP,
            ExifInterface.TAG_GPS_PROCESSING_METHOD,
            ExifInterface.TAG_ARTIST,
            ExifInterface.TAG_COPYRIGHT,
            ExifInterface.TAG_USER_COMMENT,
            ExifInterface.TAG_IMAGE_DESCRIPTION
    };

    private EditorMetadata() {}

    public static void copy(ContentResolver resolver, Uri source, Uri destination) {
        if (resolver == null || source == null || destination == null) return;
        try (InputStream input = resolver.openInputStream(source);
             ParcelFileDescriptor output = resolver.openFileDescriptor(destination, "rw")) {
            if (input == null || output == null) return;
            ExifInterface from = new ExifInterface(input);
            ExifInterface to = new ExifInterface(output.getFileDescriptor());
            for (String tag : PRESERVED_TAGS) {
                String value = from.getAttribute(tag);
                if (value != null) to.setAttribute(tag, value);
            }
            // ImageDecoder normalizes source orientation into pixels, so an edited copy must be upright.
            to.setAttribute(ExifInterface.TAG_ORIENTATION,
                    Integer.toString(ExifInterface.ORIENTATION_NORMAL));
            to.saveAttributes();
        } catch (Exception exception) {
            // Metadata is best-effort. A valid edited image must never be discarded solely for EXIF failure.
            Log.w(TAG, "Edited image saved but EXIF metadata could not be copied", exception);
        }
    }
}
