package com.paint.ar.drawing.fragment;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;

import com.paint.ar.drawing.R;
import com.paint.ar.drawing.databinding.FragmentImportBinding;
import com.paint.ar.drawing.ob.DataImport;
import com.paint.ar.drawing.ob.ObManager;
import com.paint.ar.drawing.adapter.ImportAdapter;
import com.paint.ar.drawing.helper.Utils;
import com.paint.ar.drawing.MyApp;
import com.paint.ar.drawing.topon.AdManager;
import com.paint.ar.drawing.topon.onActionListener;

import java.io.File;
import java.util.List;
import java.util.Map;

public class FragmentAlbum extends Fragment {
    private FragmentImportBinding binding;
    private String[] permissions;

    private ImportAdapter importAdapter;
    private ActivityResultLauncher<Intent> intentActivityResultLauncher;
    private ActivityResultLauncher<String[]> requestImportPermission;

    public FragmentAlbum() {

    }

    public static FragmentAlbum newInstance() {
        FragmentAlbum fragment = new FragmentAlbum();
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragmentImportBinding.inflate(getLayoutInflater());
        onInit();
        return binding.getRoot();
    }

    private void onInit() {
        binding.loading.setVisibility(View.VISIBLE);
        loadImport();
        binding.btnImport.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AdManager.showTopOn(requireActivity(), new onActionListener() {
                    @Override
                    public void onAction() {
                        checkPermission();
                    }
                });


            }
        });
        requestImportPermission = registerForActivityResult(
                new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
                    @Override
                    public void onActivityResult(Map<String, Boolean> o) {
                        boolean allGranted = true;
                        for (Map.Entry<String, Boolean> entry : o.entrySet()) {
                            String permission = entry.getKey();
                            boolean isGranted = entry.getValue();
                            if (isGranted) {
                            } else {
                                allGranted = false;
                            }
                        }

                        if (allGranted) {
                            startIntent();
                            Log.d(MyApp.TAG, "All permissions granted!");
                        } else {
                            Toast.makeText(requireContext(), getString(R.string.permission_denied), Toast.LENGTH_SHORT).show();
                            Log.d(MyApp.TAG, "Some permissions were denied!");
                        }
                    }
                }

        );
        intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
                Uri imageUri = result.getData().getData();
                if (imageUri != null) {
                    binding.loading.setVisibility(View.VISIBLE);
                    double uriFileSize = Utils.getUriFileSize(requireContext(), imageUri);
                    Log.d(MyApp.TAG, "------uriFileSize-----" + uriFileSize + "--Mb");
                    if (uriFileSize >= 5) {
                        binding.loading.setVisibility(View.GONE);
                        Toast.makeText(requireContext(), getString(R.string.import_im_too_big), Toast.LENGTH_SHORT).show();
                        return;
                    }
                    String lastPathSegment = imageUri.getLastPathSegment();
                    int index = lastPathSegment.lastIndexOf("/");

                    String name = lastPathSegment.substring(index + 1);
                    String importPath = Utils.getImportPath(name);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            File file = new File(importPath);
                            boolean isimport = ObManager.queryIsImport(importPath);
                            if (file.exists()) {
                                if (!isimport) {
                                    ObManager.insertImport(importPath);
                                }
                                requireActivity().runOnUiThread(() -> {
                                    binding.loading.setVisibility(View.GONE);
                                    if (isimport) {
                                        Toast.makeText(requireContext(), getString(R.string.import_already), Toast.LENGTH_SHORT).show();
                                    } else {
                                        DataImport dataImport = new DataImport();
                                        dataImport.setUri(importPath);
                                        importAdapter.addData(dataImport);
                                        updateUi(true);
                                    }
                                });
                            } else {
                                boolean b = Utils.saveToInternalStorage(name, imageUri, requireActivity());
                                if (b) {
                                    ObManager.insertImport(importPath);
                                }
                                requireActivity().runOnUiThread(() -> {
                                    binding.loading.setVisibility(View.GONE);
                                    if (b) {
                                        DataImport dataImport = new DataImport();
                                        dataImport.setUri(importPath);
                                        importAdapter.addData(dataImport);
                                        updateUi(true);
                                    } else {
                                        Toast.makeText(requireActivity(), getString(R.string.import_fail), Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }

                        }
                    }).start();
                }

            }

        });
    }

    private void checkPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            permissions = new String[]{Manifest.permission.READ_MEDIA_IMAGES};
        } else {
            permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        }
        if (!Utils.checkPermission(requireActivity(), permissions)) {
            requestImportPermission.launch(permissions);
        } else {
            startIntent();
        }
    }


    private void startIntent() {
        Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intentActivityResultLauncher.launch(intent);
    }





    private void loadImport() {
        importAdapter = new ImportAdapter(requireActivity());
        new Thread(new Runnable() {
            @Override
            public void run() {
                List<DataImport> importUrises = ObManager.queryAllImport();
                requireActivity().runOnUiThread(() -> {
                    importAdapter.setData(importUrises);
                    updateUi(importUrises.size() > 0);
                    binding.loading.setVisibility(View.GONE);
                });
            }
        }).start();


        binding.recyclerview.setAdapter(importAdapter);
        binding.recyclerview.setLayoutManager(new GridLayoutManager(requireActivity(), 3));
    }


    private void updateUi(boolean isShow) {
        if (isShow) {
            binding.recyclerview.setVisibility(View.VISIBLE);
            binding.layoutNoImport.setVisibility(View.GONE);
        } else {
            binding.recyclerview.setVisibility(View.GONE);
            binding.layoutNoImport.setVisibility(View.VISIBLE);
        }

    }
}