package com.lemenzo.gallery.manage;
import com.lemenzo.gallery.ui.SystemInsets;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.widget.EditText;
import android.widget.Toast;

import java.util.List;

import com.lemenzo.gallery.R;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public final class MediaManageActivity extends Activity {
    public static final String EXTRA_URIS="uris";
    private static final int REQ_WRITE=7711, REQ_TREE=7712;
    private final ExecutorService executor=Executors.newSingleThreadExecutor();
    private ArrayList<Uri> uris=new ArrayList<>();
    private int pending; private String pendingText;
    @Override public void onCreate(Bundle b){super.onCreate(b);setContentView(R.layout.activity_media_manage);
        SystemInsets.apply(this);
        ArrayList<Uri> got=getIntent().getParcelableArrayListExtra(EXTRA_URIS);if(got!=null)uris=got;
        EditText folder=findViewById(R.id.destination_folder), name=findViewById(R.id.new_name);
        findViewById(R.id.choose_existing_folder_button).setOnClickListener(v -> executor.execute(() -> {
            List<String> choices = FolderDestinationRepository.list(this, 500);
            runOnUiThread(() -> {
                if (choices.isEmpty()) { toast(R.string.no_media_folders); return; }
                new AlertDialog.Builder(this).setTitle(R.string.choose_existing_folder)
                        .setItems(choices.toArray(new String[0]), (d, which) -> folder.setText(choices.get(which)))
                        .show();
            });
        }));
        findViewById(R.id.move_button).setOnClickListener(v->{String f=folder.getText().toString();if(!valid(f))return;requestWrite(1,f);});
        findViewById(R.id.copy_button).setOnClickListener(v->{String f=folder.getText().toString();if(!valid(f))return;run(2,f);});
        findViewById(R.id.rename_button).setEnabled(uris.size()==1);findViewById(R.id.rename_button).setOnClickListener(v->{String n=name.getText().toString();if(n.trim().isEmpty()){toast(R.string.invalid_folder_name);return;}requestWrite(3,n);});
        findViewById(R.id.create_folder_button).setOnClickListener(v->startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION|Intent.FLAG_GRANT_READ_URI_PERMISSION),REQ_TREE));}
    private boolean valid(String s){if(MediaFileManager.sanitizeFolder(s).isEmpty()){toast(R.string.invalid_folder_name);return false;}return true;}
    private void requestWrite(int op,String text){try{pending=op;pendingText=text;PendingIntent pi=MediaStore.createWriteRequest(getContentResolver(),uris);startIntentSenderForResult(pi.getIntentSender(),REQ_WRITE,null,0,0,0);}catch(Exception e){run(op,text);}}
    private void run(int op,String text){executor.execute(()->{try{if(op==1)MediaFileManager.move(this,uris,text);else if(op==2)MediaFileManager.copy(this,uris,text);else if(op==3)MediaFileManager.rename(this,uris.get(0),text);runOnUiThread(()->{toast(R.string.media_operation_complete);setResult(RESULT_OK);finish();});}catch(Exception e){runOnUiThread(()->toast(R.string.media_operation_failed));}});}
    @Override protected void onActivityResult(int req,int result,Intent data){super.onActivityResult(req,result,data);if(req==REQ_WRITE&&result==RESULT_OK){run(pending,pendingText);}else if(req==REQ_TREE&&result==RESULT_OK&&data!=null&&data.getData()!=null){promptCreate(data.getData());}}
    private void promptCreate(Uri tree){EditText input=new EditText(this);input.setHint(R.string.folder_name_hint);new AlertDialog.Builder(this).setTitle(R.string.create_folder).setView(input).setNegativeButton(android.R.string.cancel,null).setPositiveButton(R.string.create_folder,(d,w)->{String n=MediaFileManager.sanitizeFolder(input.getText().toString());if(n.isEmpty()){toast(R.string.invalid_folder_name);return;}try{Uri doc=DocumentsContract.buildDocumentUriUsingTree(tree,DocumentsContract.getTreeDocumentId(tree));Uri made=DocumentsContract.createDocument(getContentResolver(),doc,DocumentsContract.Document.MIME_TYPE_DIR,n);toast(made!=null?R.string.media_operation_complete:R.string.media_operation_failed);}catch(Exception e){toast(R.string.media_operation_failed);}}).show();}
    private void toast(int id){Toast.makeText(this,id,Toast.LENGTH_SHORT).show();}
    @Override protected void onDestroy(){executor.shutdownNow();super.onDestroy();}
}
