package com.prank.simulator.sounds.actfrag;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
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.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;

import com.prank.simulator.sounds.data.ChildData;
import com.prank.simulator.sounds.databinding.FragImportBinding;
import com.prank.simulator.sounds.dialog.PopupImport;
import com.prank.simulator.sounds.helper.Db;
import com.prank.simulator.sounds.helper.Static;
import com.prank.simulator.sounds.helper.Utils;
import com.prank.simulator.sounds.listener.OnClickImport;
import com.prank.simulator.sounds.recycler.FavoriteAdapter;

import java.util.List;
import java.util.Map;


public class RecordFragment extends Fragment implements View.OnClickListener , OnClickImport {


    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;
    private FragImportBinding binding;
    private FavoriteAdapter adapter;
    private ActivityResultLauncher<String> requestRecordAudioLauncher;
    private ActivityResultLauncher<String> audioPickerLauncher;
    private ActivityResultLauncher<String[]> requestStorePermissionsLauncher;
    private PopupImport popupImport;
    public RecordFragment() {
        // Required empty public constructor
    }

    public static RecordFragment newInstance() {
        RecordFragment fragment = new RecordFragment();
        Bundle args = new Bundle();
//        args.putString(ARG_PARAM1, param1);
//        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
        requestRecordAudioLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestPermission(),
                isGranted -> {
                    if (isGranted) {
                        intentRecordAudio();
                    } else {
                        Toast.makeText(requireContext(), "Recording permission denied", Toast.LENGTH_SHORT).show();
                    }
                }
        );

        requestStorePermissionsLauncher = 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) {
//
//                                Toast.makeText(requireContext(), permission + " 权限已授予", Toast.LENGTH_SHORT).show();
//                            } else {
//                                // 权限被拒绝
//                                Toast.makeText(requireContext(), permission + " 权限被拒绝", Toast.LENGTH_SHORT).show();
//                            }
                        }
                        if (isGranted) {
                            importAudio();
                        }else {
                            Toast.makeText(requireContext(),   " 权限被拒绝", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
        );
        audioPickerLauncher = registerForActivityResult(new ActivityResultContracts.GetContent(),
                new ActivityResultCallback<Uri>() {
                    @Override
                    public void onActivityResult(Uri uri) {
                        // Handle the returned Uri

                        if (uri != null) {
                            long duration = Utils.getAudioDuration(requireContext(), uri);
                            Intent intent = new Intent(requireContext(), StoreActivity.class);
                            intent.putExtra(StoreActivity.KEY_Path, uri.toString());
                            intent.putExtra(StoreActivity.KEY_Time, duration);
                            startActivity(intent);
                        }
                    }
                });
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        binding = FragImportBinding.inflate(getLayoutInflater());

        binding.menu.setOnClickListener(this);
        binding.recyclerImport.setLayoutManager(new GridLayoutManager(requireContext(), 2));
        List<ChildData> all = Db.getAllCustomization();
        updateUi(all);
        adapter = new FavoriteAdapter(requireContext(), all,true);
        binding.recyclerImport.setAdapter(adapter);


        return binding.getRoot();
    }


    public void refresh() {
        if (adapter != null) {
            List<ChildData> all = Db.getAllCustomization();
            updateUi(all);
            adapter.updateData(all);
        }

    }

    private void updateUi(List<ChildData> all) {
        if (all.size() == 0) {
            binding.noImportHint.setVisibility(View.VISIBLE);
            binding.recyclerImport.setVisibility(View.GONE);
        } else {
            binding.noImportHint.setVisibility(View.GONE);
            binding.recyclerImport.setVisibility(View.VISIBLE);
        }
    }

    private void checkAndRequestAudioPermission() {
        if (ContextCompat.checkSelfPermission(requireContext(), Static.permission_record_audio)
                != PackageManager.PERMISSION_GRANTED) {
            requestRecordAudioLauncher.launch(Static.permission_record_audio);
        } else {
            intentRecordAudio();
        }
    }

    private void intentRecordAudio() {
        Intent intent = new Intent(requireContext(), RecordActivity.class);
        startActivity(intent);
    }

    @Override
    public void onClick(View v) {
         if(v.equals(binding.menu)){
            if (popupImport == null) {
                popupImport = new PopupImport(requireActivity(), this);
            }
            popupImport.showBottom(binding.menu);
        }
    }



    private void importAudio() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("audio/*");
        audioPickerLauncher.launch("audio/*");

    }


    @Override
    public void onClickTimerListener(int type) {
        switch (type){
            case 0:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                    if (ContextCompat.checkSelfPermission(requireContext(), Static.permission_read_audio[0])
                            != PackageManager.PERMISSION_GRANTED) {
                        requestStorePermissionsLauncher.launch(Static.permission_read_audio);
//                    ActivityCompat.requestPermissions(requireActivity(), ConstValues.permission_read_audio,
//                            ConstValues.REQUEST_READ_STORAGE_PERMISSION);
                    } else {
                        importAudio();
                    }
                } else {
                    if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            != PackageManager.PERMISSION_GRANTED ||
                            ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_EXTERNAL_STORAGE)
                                    != PackageManager.PERMISSION_GRANTED) {
                        requestStorePermissionsLauncher.launch(Static.permission_store);
//                    ActivityCompat.requestPermissions(requireActivity(), ConstValues.permission_store, ConstValues.REQUEST_READ_STORAGE_PERMISSION);
                    } else {
                        importAudio();
                    }
                }
                break;
            case 1:
                checkAndRequestAudioPermission();
                break;
        }
    }
}