package com.junjunguo.pocketmaps.activities;

import com.junjunguo.pocketmaps.R;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Permission  extends AppCompatActivity
implements ActivityCompat.OnRequestPermissionsResultCallback, OnClickListener
{
  static String[] sPermission;
  static boolean isFirstForcedPermission;
  static int idCounter = 0;
  static boolean isAsking = false;

  /** Start a Permission-Request, and calls activity.finish().
   *  @param sPermission The Permission of android.Manifest.permission.xyz
   *  @param isFirstForcedPermission True, if the first one of sPermission is forced. **/
  public static void startRequest(String[] sPermission, boolean isFirstForcedPermission, Activity activity)
  {
    Permission.sPermission = sPermission;
    Permission.isFirstForcedPermission = isFirstForcedPermission;

    Intent intent = new Intent(activity, Permission.class);
    activity.startActivity(intent);
//    activity.finish();
  }
  
  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (sPermission == null) { finish(); return; }
    setContentView(R.layout.activity_text);
    Button okButton = (Button) findViewById(R.id.okTextButton);
    EditText listText = (EditText) findViewById(R.id.areaText);
    listText.setFocusable(false);
    listText.setText(getPermissionText());
    okButton.setOnClickListener(this);
  }
  
  private CharSequence getPermissionText()
  {
    StringBuilder sb = new StringBuilder();
    sb.append("Asking for permissions:\n\n");
    String necessary = "Necessary:\n";
    if (!isFirstForcedPermission) { necessary = "Recommended:\n"; }
    for (String curPermission : sPermission)
    {
      sb.append(necessary);
      necessary = "Recommended:\n";
      sb.append(curPermission.replace('.', '\n'));
      sb.append("\n\n");
    }
    return sb;
  }

  @Override protected void onResume()
  {
    super.onResume();
    if (!isAsking) {}
    else if (checkPermission(sPermission[0], this))
    {
      finish();
    }
    else if (!isFirstForcedPermission)
    {
      finish();
    }
    else
    {
      logUser("App needs access!!!");
    }
    isAsking = false;
  }
  
  @Override
  public void onClick(View v)
  {
    if (v.getId()==R.id.okTextButton)
    {
      log("Selected: Permission-Ok");
      requestPermissionLater(sPermission);
      isAsking = true;
    }
  }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            if (grantResults.length >= 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                finish();
            } else {
              if (!isFirstForcedPermission)
              {
                finish();
              }
              else
              {
                logUser("App needs access for this feature!");
              }
            }
    }

    /** Check if permission is already permitted.
     *  @param sPermission The Permission of android.Manifest.permission.xyz **/
    public static boolean checkPermission(String sPermission, Context context) {
        // Check if the Camera permission has been granted
        if (ActivityCompat.checkSelfPermission(context, sPermission)
                == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
    
    /** Check for permission to permit.
     *  @param sPermission The Permission of android.Manifest.permission.xyz **/
    private void requestPermissionLater(String[] sPermission) {
//        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
//                sPermission)) {
                    ActivityCompat.requestPermissions(this,
                            sPermission,
                            getId());
//        } else {
//          logUser("Permission is not available: " + sPermission);
//          return false;
//        }
    }
    
    private int getId()
    {
      idCounter ++;
      return idCounter;
    }

    private void log(String str)
    {
      Log.i(Permission.class.getName(), str);
    }
    
    private void logUser(String str)
    {
      Log.i(Permission.class.getName(), str);
      try
      {
        Toast.makeText(this.getBaseContext(), str, Toast.LENGTH_SHORT).show();
      }
      catch (Exception e) { e.printStackTrace(); }
    }
}