package com.lemenzo.gallery.smart;

import com.lemenzo.gallery.model.MediaItem;
import com.lemenzo.gallery.model.MediaType;

import java.util.Locale;

/** Deterministic, local-only metadata categorization. Visual checks (including selfie/portrait detection) are delegated separately. */
public final class SmartCategoryClassifier {
    public enum Category { SCREENSHOTS, DOCUMENTS, SELFIES, CAMERA, DOWNLOADS, VIDEOS, ANIMATED, RAW, MOTION_PHOTO }

    private SmartCategoryClassifier() {}

    public static boolean matches(MediaItem item, Category category) {
        String name = lower(item.displayName);
        String bucket = lower(item.bucketName);
        String mime = lower(item.mimeType);
        switch (category) {
            case SCREENSHOTS:
                return name.contains("screenshot") || bucket.contains("screenshot");
            case DOCUMENTS:
                return bucket.contains("document") || name.contains("scan") || name.contains("document");
            case SELFIES:
                return bucket.contains("selfie") || name.contains("selfie");
            case CAMERA:
                return bucket.contains("camera") || bucket.contains("dcim");
            case DOWNLOADS:
                return bucket.contains("download");
            case VIDEOS:
                return item.type == MediaType.VIDEO;
            case ANIMATED:
                return mime.contains("gif") || mime.contains("webp");
            case RAW:
                return mime.contains("dng") || name.endsWith(".dng");
            case MOTION_PHOTO:
                // Verified through MotionPhotoUtils at query time. Filename heuristics are intentionally forbidden.
                return false;
            default:
                return false;
        }
    }

    public static String searchToken(Category category) {
        switch (category) {
            case SCREENSHOTS: return "screenshots";
            case DOCUMENTS: return "documents";
            case SELFIES: return "selfies";
            case CAMERA: return "camera";
            case DOWNLOADS: return "downloads";
            case VIDEOS: return "videos";
            case ANIMATED: return "gif";
            case RAW: return "raw";
            case MOTION_PHOTO: return "motion";
            default: return "";
        }
    }

    private static String lower(String value) {
        return value == null ? "" : value.toLowerCase(Locale.ROOT);
    }
}
