package com.lemenzo.gallery.manage;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

/** Scoped-storage media management; never requests broad all-files access. */
public final class MediaFileManager {
    private MediaFileManager() {}

    public static String sanitizeFolder(String raw) {
        if (raw == null) return "";
        String s = raw.trim().replace('\\','/').replaceAll("/+", "/");
        s = s.replace("..", "").replaceAll("[^A-Za-z0-9 _./()-]", "").trim();
        while (s.startsWith("/")) s=s.substring(1);
        while (s.endsWith("/")) s=s.substring(0,s.length()-1);
        return s;
    }

    public static String normalizeRelativePath(String raw) {
        String clean = sanitizeFolder(raw);
        if (clean.isEmpty()) return "";
        // A path selected from MediaStore remains a scoped RELATIVE_PATH. A simple name is
        // treated as a new Lemenzo-owned folder for backwards-compatible, safe UX.
        if (!clean.contains("/")) clean = "DCIM/Lemenzo/" + clean;
        return clean + "/";
    }

    public static String targetPath(String folder) { return normalizeRelativePath(folder); }

    public static void move(Context context, List<Uri> uris, String folder) {
        String path=targetPath(folder); if(path.isEmpty()) throw new IllegalArgumentException("folder");
        ContentValues values=new ContentValues(); values.put(MediaStore.MediaColumns.RELATIVE_PATH,path);
        for(Uri uri:uris) context.getContentResolver().update(uri,values,null,null);
    }

    public static void rename(Context context, Uri uri, String requested) {
        String name=sanitizeFileName(requested); if(name.isEmpty()) throw new IllegalArgumentException("name");
        String oldName=queryString(context,uri,MediaStore.MediaColumns.DISPLAY_NAME);
        if(!name.contains(".") && oldName!=null){int dot=oldName.lastIndexOf('.'); if(dot>0)name+=oldName.substring(dot);}
        ContentValues v=new ContentValues(); v.put(MediaStore.MediaColumns.DISPLAY_NAME,name);
        context.getContentResolver().update(uri,v,null,null);
    }

    public static void copy(Context context, List<Uri> uris, String folder) throws Exception {
        String path=targetPath(folder); if(path.isEmpty()) throw new IllegalArgumentException("folder");
        for(Uri source:uris) copyOne(context,source,path);
    }

    private static void copyOne(Context context, Uri source, String path) throws Exception {
        ContentResolver r=context.getContentResolver();
        String name=queryString(context,source,MediaStore.MediaColumns.DISPLAY_NAME);
        String mime=queryString(context,source,MediaStore.MediaColumns.MIME_TYPE);
        boolean video=mime!=null && mime.startsWith("video/");
        Uri collection=video?MediaStore.Video.Media.EXTERNAL_CONTENT_URI:MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        ContentValues v=new ContentValues(); v.put(MediaStore.MediaColumns.DISPLAY_NAME, uniqueName(name));
        if(mime!=null)v.put(MediaStore.MediaColumns.MIME_TYPE,mime); v.put(MediaStore.MediaColumns.RELATIVE_PATH,path); v.put(MediaStore.MediaColumns.IS_PENDING,1);
        Uri out=r.insert(collection,v); if(out==null)throw new IllegalStateException("insert");
        boolean ok=false;
        try(InputStream in=r.openInputStream(source); OutputStream os=r.openOutputStream(out,"w")){
            if(in==null||os==null)throw new IllegalStateException("stream"); byte[] buf=new byte[256*1024]; int n; while((n=in.read(buf))!=-1)os.write(buf,0,n); ok=true;
        } finally {
            if(ok){ContentValues done=new ContentValues();done.put(MediaStore.MediaColumns.IS_PENDING,0);r.update(out,done,null,null);} else r.delete(out,null,null);
        }
    }

    private static String queryString(Context c, Uri uri, String column){try(Cursor q=c.getContentResolver().query(uri,new String[]{column},null,null,null)){return q!=null&&q.moveToFirst()?q.getString(0):null;}}
    private static String uniqueName(String n){if(n==null||n.trim().isEmpty())return "Lemenzo_copy";int d=n.lastIndexOf('.');String b=d>0?n.substring(0,d):n,e=d>0?n.substring(d):"";return b+"_copy_"+System.currentTimeMillis()+e;}
    private static String sanitizeFileName(String s){return s==null?"":s.trim().replaceAll("[\\/:*?\"<>|]","_");}
}
