package com.algobase.share.app;

import java.util.ArrayList;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.DialogInterface;

import android.net.Uri;

import android.app.Activity;
import android.app.Dialog;

/*
import androidx.fragment.app.FragmentActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
*/

import com.algobase.share.dialog.*;


public class PermissionHandler
{
  static final int REQUEST_CODE = 7777;

  public void showToast(String txt) {}
  public void writeLog(String txt) {}



  //FragmentActivity activity;
  Activity activity;
  String dialog_title;
  String pkg_name;
  PackageManager pkg_mgr;

  String language = "English";

  String[] permissions = new String[16];
  int[] granted = new int[16];

  int num_permissions = 0;


  //public PermissionHandler(FragmentActivity act, String title)
  public PermissionHandler(Activity act, String title)
  { activity = act;
    dialog_title = title;
    pkg_name = act.getPackageName();
    pkg_mgr = activity.getPackageManager();
   }

  public void setLanguage(String lang) { language = lang; }

  public void clear() {
    num_permissions = 0;
  }

  public void add(String permission)
  { permissions[num_permissions] = permission;
    granted[num_permissions] = 0;
    num_permissions++;
   }

  public boolean granted(int i) { 
     return granted[i] == PackageManager.PERMISSION_GRANTED;
  }


 public String permissionInfo(String perm)
 {
    PermissionInfo pi = null;
    try {
           pi = pkg_mgr.getPermissionInfo(perm,PackageManager.GET_META_DATA);
    } catch(Exception ex) {}

    if (pi == null) return null;

    return pi.loadLabel(pkg_mgr).toString() + "\n" + 
           pi.loadDescription(pkg_mgr).toString();
 }


 public int check_permissions() 
 {  // check but do not request permissions 
    // return number of non-granted permissions

   int missing = 0;

   for(int i=0; i < num_permissions; i++){
     //granted[i] = ContextCompat.checkSelfPermission(activity,permissions[i]);
     granted[i] = activity.checkSelfPermission(permissions[i]); 
     if (granted[i] != PackageManager.PERMISSION_GRANTED) missing++;
   }

   return missing;
 }


 boolean request_permissions1() 
 {
   ArrayList<String> L = new ArrayList<String>();

   for(int i=0; i < num_permissions; i++){
/*
     if (ContextCompat.checkSelfPermission(activity,permissions[i]) != 
                                           PackageManager.PERMISSION_GRANTED)
*/
     if (activity.checkSelfPermission(permissions[i]) != 
                                           PackageManager.PERMISSION_GRANTED)
     L.add(permissions[i]); 
   }

   if (L.isEmpty()) return true;

   // one or more permission not granted

   String[] arr = L.toArray(new String[0]);

 //ActivityCompat.requestPermissions(activity,arr,REQUEST_CODE);
   activity.requestPermissions(arr,REQUEST_CODE);
   return false;
 }



 public boolean request_permissions() 
 { 
   int count = check_permissions();
   if (count == 0) return true;

   String[] arr = new String[count];

   int j = 0;
   for(int i=0; i<num_permissions; i++) {
     if (granted[i] != PackageManager.PERMISSION_GRANTED) {
        arr[j++] = permissions[i];
     }
   }
   
 //ActivityCompat.requestPermissions(activity,arr,REQUEST_CODE);
   activity.requestPermissions(arr,REQUEST_CODE);

   return false;
 }

  public boolean handle_results(String msg, String[] perms, int[] results)
  {
    return handle_results(msg,perms,results,false);
   }

  public boolean handle_results(String msg, String[] perms, int[] results,
                                final boolean must_exit)
  { int missing = 0;
    for(int i=0; i<results.length; i++) {

    if (perms[i].equals("android.permission.WRITE_EXTERNAL_STORAGE")) continue;

      granted[i] = results[i];
      if (results[i] != PackageManager.PERMISSION_GRANTED) missing++;
     }
      
    if (missing == 0)  return true;

    // missing permissions

    int k = 0;
    for(int i=0; i<results.length; i++) {
       if (activity.shouldShowRequestPermissionRationale(permissions[i])) k++;
    }

    //showToast("Not permanently denied: " + k);

    String title = "Permissions";

    if (k > 0)
    { // some missing permissions are not permanently denied
      // show rational and request again

      if (language.equals("Deutsch")) title = "Berechtigungen";

      final MyDialog dialog = new MyDialog(activity,title);
      dialog.setMessageTextSize(18);
      dialog.setButtonTextSize(19);

      dialog.setMessage(msg + "\n");

      dialog.setPositiveButton("OK", 
           new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface d, int which) {
                     //check_and_request();
                     request_permissions();
                    }
      });
    
      dialog.setNegativeButton("Exit", 
             new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface d, int which) {
                   if (must_exit) activity.finish();
                 }
      });

      dialog.setOnCancelListener(
             new DialogInterface.OnCancelListener() {
                 public void onCancel(DialogInterface dialog) {
                   if (must_exit)activity.finish();
                 }
      });


  
      dialog.show();
      return false;
    }


    // missing permissions are permanently blocked

     if (language.equals("Deutsch"))
        msg += "Einige dieser Berechtigungen wurden permanent " +
               "verweigert und müssen nun in den App-Info " +
               "Einstellungen aktiviert werden.";
     else
        msg += "Some of these permissions have been denied permanently " + 
               "and now have to be granted in the App-Info settings.";
     

      final MyDialog dialog = new MyDialog(activity,title);
      dialog.setMessageTextSize(18);
      dialog.setButtonTextSize(19);

      dialog.setMessage(msg + "\n");

      dialog.setPositiveButton("App-Info", 
        new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface d, int which) {
             Uri pkgUri = Uri.parse("package:" + pkg_name);
             Intent intent = 
             new Intent("android.settings.APPLICATION_DETAILS_SETTINGS",pkgUri);
             activity.startActivity(intent);
             activity.finish();
           }
        });
    
       String label = must_exit ? "Exit" : "Continue";
       dialog.setNegativeButton(label,
             new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface d, int which) {
                     if (must_exit) activity.finish();
                   }
       });

       dialog.setOnCancelListener(
               new DialogInterface.OnCancelListener() {
                   public void onCancel(DialogInterface dialog) {
                     if (must_exit) activity.finish();
                   }
       });
    
       dialog.show();
       return false;
    }




  public boolean hasPermission(String permission) {
     return  pkg_mgr.checkPermission(permission, pkg_name)
                                          == PackageManager.PERMISSION_GRANTED;
  }

  public String getLabel(String permission) 
  { String label = null;
    try { PermissionInfo pInfo = pkg_mgr.getPermissionInfo(permission, 0);
          label = pInfo.loadLabel(pkg_mgr).toString();
    } catch (Exception e) {}
    return label;
  }


   public String getDescription(String permission) 
   { String description = null;
     try { PermissionInfo pInfo = pkg_mgr.getPermissionInfo(permission,0);
           description = pInfo.loadDescription(pkg_mgr).toString();
     } catch (Exception e) {}
     return description;
   }

}
