package com.ar.sketch.drawing.frag;

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.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;

import com.ar.sketch.drawing.MyApp;
import com.ar.sketch.drawing.R;
import com.ar.sketch.drawing.myadapter.AdapterImport;
import com.ar.sketch.drawing.databinding.FragmentImportBinding;
import com.ar.sketch.drawing.dbManager.BeanImport;
import com.ar.sketch.drawing.dbManager.MyDb;
import com.ar.sketch.drawing.utils.MyUtils;

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

public class FragmentImport extends Fragment   {

    private FragmentImportBinding binding;


    private String[] permissions;

    private AdapterImport adapterImport;
    private ActivityResultLauncher<Intent> intentActivityResultLauncher;
    private ActivityResultLauncher<String[]> permissionsLauncher;
    public FragmentImport() {

    }

    public static FragmentImport newInstance() {
        FragmentImport fragment = new FragmentImport();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        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) {
                checkPermission();
            }
        });

        permissionsLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestMultiplePermissions(),
                new ActivityResultCallback<Map<String, Boolean>>() {
                    @Override
                    public void onActivityResult(Map<String, Boolean> result) {
                        Boolean isGranted = true;
                        for (Map.Entry<String, Boolean> entry : result.entrySet()) {
                            String permission = entry.getKey();
                            isGranted = entry.getValue();
                            if(!entry.getValue()){
                                isGranted = false;
                            }
                        }
                        if (isGranted) {
                            startIntent();
                        }else {
                            Toast.makeText(requireContext(),   " Permission denied", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
        );
        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 = MyUtils.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 = MyUtils.getImportPath(name);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            File file = new File(importPath);
                            boolean isimport = MyDb.queryIsImport(importPath);
                            if (file.exists()) {
                                if (!isimport) {
                                    MyDb.insertImport(importPath);
                                }
                                requireActivity().runOnUiThread(() -> {
                                    binding.loading.setVisibility(View.GONE);
                                    if (isimport) {
                                        Toast.makeText(requireContext(), getString(R.string.import_already), Toast.LENGTH_SHORT).show();
                                    } else {
                                        BeanImport beanImport = new BeanImport();
                                        beanImport.setUri(importPath);
                                        adapterImport.addData(beanImport);
                                        updateUi(true);
                                    }
                                });
                            } else {
                                boolean b = MyUtils.saveToInternalStorage(name, imageUri, requireContext());
                                if (b) {
                                    MyDb.insertImport(importPath);
                                }
                                requireActivity().runOnUiThread(() -> {
                                    binding.loading.setVisibility(View.GONE);
                                    if (b) {
                                        BeanImport beanImport = new BeanImport();
                                        beanImport.setUri(importPath);
                                        adapterImport.addData(beanImport);
                                        updateUi(true);
                                    } else {
                                        Toast.makeText(requireContext(), 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 (!MyUtils.checkPermission(requireActivity(), permissions)) {
            permissionsLauncher.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() {
        adapterImport = new AdapterImport(requireActivity());
        new Thread(new Runnable() {
            @Override
            public void run() {
                List<BeanImport> importUrises = MyDb.queryAllImport();
                requireActivity().runOnUiThread(() -> {
                    adapterImport.setData(importUrises);
                    updateUi(importUrises.size() > 0);
                    binding.loading.setVisibility(View.GONE);
                });
            }
        }).start();
        binding.recyclerview.setAdapter(adapterImport);
        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);
        }

    }


}