package com.lukaut.android.fragments;
    import android.Manifest;
    import android.app.ProgressDialog;
    import android.content.ContentResolver;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.content.ContextCompat;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.MimeTypeMap;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.ProgressBar;
    import android.widget.Toast;
    import com.bumptech.glide.Glide;
    import com.google.android.gms.tasks.OnFailureListener;
    import com.google.android.gms.tasks.OnSuccessListener;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.firestore.DocumentSnapshot;
    import com.google.firebase.firestore.FirebaseFirestore;
    import com.google.firebase.firestore.SetOptions;
    import com.google.firebase.storage.FirebaseStorage;
    import com.google.firebase.storage.OnProgressListener;
    import com.google.firebase.storage.StorageReference;
    import com.google.firebase.storage.UploadTask;
    import com.lukaut.android.Model.UserModel;
    import com.lukaut.android.R;
    import com.squareup.picasso.Picasso;
    import java.io.IOException;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import butterknife.BindView;
    import butterknife.ButterKnife;
    import butterknife.OnClick;
    import static android.app.Activity.RESULT_OK;
/**
 * A simple {@link Fragment} subclass.
 */
public class EditProfileFragment extends Fragment {
    private static final int STORAGE_PERMISSION_CODE = 23;
    private FirebaseAuth mAuth;
    UploadTask uploadTask;
    public static final int PICK_IMAGE = 1;
    ProgressBar progressBar;
    FirebaseFirestore firestore;
    private static final String TAG = "Editprofile";
    @BindView(R.id.edit_fullname)EditText edit_user_fullname;
    @BindView(R.id.edit_email)EditText edit_user_email;
    @BindView(R.id.edit_mobile)EditText edit_user_phoneno;
    @BindView(R.id.edit_age)EditText edit_user_age;
    @BindView(R.id.edit_e_fullname_1)EditText edit_e_fullname_1;
    @BindView(R.id.edit_e_fullname_2)EditText edit_e_fullname_2;
    @BindView(R.id.edit_e_fullname_3)EditText edit_e_fullname_3;
    @BindView(R.id.edit_e_number_1)EditText edit_e_number_1;
    @BindView(R.id.edit_e_number_2)EditText edit_e_number_2;
    @BindView(R.id.edit_e_number_3)EditText edit_e_number_3;
    private static final int GALLERY_INTENT = 2;
    private StorageReference storageReference,imageRef;
    ProgressDialog progressDialog;
    Uri selectedImage;
    @BindView(R.id.img_user_profile_pic)
    ImageView img_user_profile_pic;
    public EditProfileFragment() {
        // Required empty public constructor
    }
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_edit_profile, container, false);
        ButterKnife.bind(this,v);
        getActivity().setTitle("Edit your profile");
        firestore = FirebaseFirestore.getInstance();
        mAuth = FirebaseAuth.getInstance();
        storageReference = FirebaseStorage.getInstance().getReference();
        getUserDetails(mAuth.getUid());
        return  v;
    }
    private void getUserDetails(String uid) {
        firestore.collection("Users").document(mAuth.getUid()).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
            @Override
            public void onSuccess(DocumentSnapshot documentSnapshot) {
                try {
                    UserModel userModel = documentSnapshot.toObject(UserModel.class);
                    //if (!userModel.getUserEmail().isEmpty() || !userModel.getUserEmail().equals("")) {
                     //   loadHomeFragment();
                    //} else {
                        edit_user_fullname.setText(userModel.getUserFullName());
                        edit_user_email.setText(userModel.getUserEmail());
                        edit_user_age.setText(userModel.getUserAge());
                        edit_user_phoneno.setText(userModel.getUserPhoneNo());
                        edit_e_fullname_1.setText(userModel.getEmergency_UserFullName_1());
                        edit_e_fullname_2.setText(userModel.getEmergency_UserFullName_2());
                        edit_e_fullname_3.setText(userModel.getEmergency_UserFullName_3());
                        edit_e_number_1.setText(userModel.getEmergency_UserPhoneNo_1());
                        edit_e_number_2.setText(userModel.getEmergency_UserPhoneNo_2());
                        edit_e_number_3.setText(userModel.getEmergency_UserPhoneNo_3());
                        if (!userModel.getUserProfilePic().equals("") ||!userModel.getUserProfilePic().isEmpty()){
//                            Glide.with(getActivity()).load(userModel.getUserProfilePic()).into(img_user_profile_pic);
Facing an error in below line
 Picasso.with(getActivity()).load(userModel.getUserProfilePic()).placeholde r(R.drawable.placeholder).into(img_user_profile_pic);
                        }
                    //}
                        }catch(Exception e){
                            e.printStackTrace();
                            Log.d(TAG, "user details " + e.getMessage());
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    e.printStackTrace();
                }
            });
        }
        @OnClick(R.id.button_save_details)public void saveDetails() {
            final String userFullNameText = edit_user_fullname.getText().toString();
            final String userEmailText = edit_user_email.getText().toString();
            final String userPhoneNoText = edit_user_phoneno.getText().toString();
            final String userAgeText = edit_user_age.getText().toString();
            final String euserFullName_1 = edit_e_fullname_1.getText().toString();
            final String euserFullName_2 = edit_e_fullname_2.getText().toString();
            final String euserFullName_3 = edit_e_fullname_3.getText().toString();
            final String euserPhoneno_1 = edit_e_number_1.getText().toString();
            final String euserPhoneno_2 = edit_e_number_2.getText().toString();
            final String euserPhoneno_3 = edit_e_number_3.getText().toString();
            String regx = "^[\\p{L} .'-]+$";
            CharSequence inputStr = edit_user_fullname.getText().toString();
            Pattern pattern = Pattern.compile(regx);
            Matcher matcher = pattern.matcher(inputStr);
            if (!matcher.matches()) {
                Toast.makeText(getActivity(), "Plz enter valid full name", Toast.LENGTH_SHORT).show();
                return;
            }
            if (selectedImage != null) {
                imageRef = storageReference.child("profile/" + System.currentTimeMillis() + "." + GetFileExtension(selectedImage));
                progressDialog = new ProgressDialog(getActivity());
                progressDialog.setMax(100);
                progressDialog.setMessage("Uploading...");
                progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                progressDialog.show();
                progressDialog.setCancelable(false);
                //starting upload
                uploadTask = imageRef.putFile(selectedImage);
                // Observe state change events such as progress, pause, and resume
                uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                        double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                        //sets and increments value of progressbar
                        progressDialog.incrementProgressBy((int) progress);
                    }
                });
                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(getActivity(), "Error in uploading!", Toast.LENGTH_SHORT).show();
                        progressDialog.dismiss();
                    }
                }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
                        Uri downloadUrl = taskSnapshot.getDownloadUrl();
                        Log.d(TAG, "image uploaded at :" + downloadUrl);
                        final UserModel userModel = new UserModel(mAuth.getUid(), userFullNameText, userEmailText, userPhoneNoText, userAgeText, euserFullName_1, euserFullName_2, euserFullName_3, euserPhoneno_1, euserPhoneno_2, euserPhoneno_3,downloadUrl.toString());
                        firestore.collection("Users").document(mAuth.getUid()).set(userModel, SetOptions.merge()).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d(TAG, "DocumentSnapshot successfully written!" + userModel.toString());
                                Toast.makeText(getActivity(), "Successfully Saved", Toast.LENGTH_SHORT).show();
                               // loadHomeFragment();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.w(TAG, "Error writing document", e);
                            }
                        });
                        Toast.makeText(getActivity(), "Upload successful", Toast.LENGTH_SHORT).show();
                        progressDialog.dismiss();
                        //showing the uploaded image in ImageView using the download url
                        //Picasso.with(UploadActivity.this).load(downloadUrl).into(img_user_profile_pic);
                    }
                });
            } else {
                final UserModel userModel = new UserModel(mAuth.getUid(), userFullNameText, userEmailText, userPhoneNoText, userAgeText, euserFullName_1, euserFullName_2, euserFullName_3, euserPhoneno_1, euserPhoneno_2, euserPhoneno_3);
                firestore.collection("Users").document(mAuth.getUid()).set(userModel, SetOptions.merge()).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "DocumentSnapshot successfully written!" + userModel.toString());
                        Toast.makeText(getActivity(), "Successfully Saved", Toast.LENGTH_SHORT).show();
    //                    loadHomeFragment();
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error writing document", e);
                    }
                });
            }
        }
        public String GetFileExtension(Uri uri) {
            ContentResolver contentResolver = getActivity().getContentResolver();
            MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
            // Returning the file Extension.
            return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri)) ;
        }
        private void loadHomeFragment() {
            Fragment homef = new MapsFragment();
            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
            ft.setCustomAnimations(R.anim.fragment_slide_left_enter, R.anim.fragment_slide_left_exit, R.anim.fragment_slide_right_enter, R.anim.fragment_slide_right_exit);
            ft.replace(R.id.container, homef);
            ft.commit();
        }
        @OnClick(R.id.img_user_profile_pic)
        public void uploadImage(){
            if (isReadStorageAllowed()){
    //            Intent i = new Intent(Intent.ACTION_PICK);
    //            i.setType("image/*");
    //            startActivityForResult(i,GALLERY_INTENT);
                Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
                getIntent.setType("image/*");
                Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                pickIntent.setType("image/*");
                Intent chooserIntent = Intent.createChooser(getIntent, "Select image to upload");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});
                startActivityForResult(chooserIntent,GALLERY_INTENT);
            }else {
                requestStoragePermission();
            }
        }
    //    private void pickImage(){
    //        Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    //        getIntent.setType("image/*");
    //
    //        Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    //        pickIntent.setType("image/*");
    //
    //        Intent chooserIntent = Intent.createChooser(getIntent, "Select image to upload");
    //        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});
    //
    //        startActivityForResult(chooserIntent, PICK_IMAGE);
    //    }
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == GALLERY_INTENT && resultCode== RESULT_OK ){
                Uri uri = data.getData();
    //            selectedImage = storageReference.child("profile").child(uri.getd);
                selectedImage = uri;
                Bitmap bitmap = null;
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(),uri);
                    img_user_profile_pic.setImageBitmap(bitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        private boolean isReadStorageAllowed() {
            //Getting the permission status
            int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);
            //If permission is granted returning true
            if (result == PackageManager.PERMISSION_GRANTED)
                return true;
            //If permission is not granted returning false
            return false;
        }
        private void requestStoragePermission(){
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
                //If the user has denied the permission previously your code will come to this block
                //Here you can explain why you need this permission
                //Explain here why you need this permission
            }
            //And finally ask for the permission
            ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},STORAGE_PERMISSION_CODE);
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            //Checking the request code of our request
            if(requestCode == STORAGE_PERMISSION_CODE){
                //If permission is granted
                if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //Displaying a toast
                    //Toast.makeText(this,"Permission granted now you can read the storage",Toast.LENGTH_LONG).show();
                }else{
                    //Displaying another toast if permission is not granted
                    //CustomDialogClass.showAlert(CreateActivity.this,"Oops you just denied the permission\n Allow permission to upload pics");
                    Toast.makeText(getActivity(), "Allow storage permission to upload image", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at com.lukaut.android.fragments.EditProfileFragment$2.onSuccess(EditProfileFragment.java:132)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at com.lukaut.android.fragments.EditProfileFragment$2.onSuccess(EditProfileFragment.java:114)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at com.google.android.gms.tasks.zzj.run(Unknown Source)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at android.os.Looper.loop(Looper.java:154)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6123)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
03-25 03:06:50.762 10269-10269/com.lukaut.android W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
 
    