package com.example.status_saver.adapters;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.documentfile.provider.DocumentFile;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.cv.status.R;
import com.example.status_saver.PreViewActivity;
import com.example.status_saver.model.StatusModel;
import com.example.status_saver.utils.SingleMediaScanner;

import org.apache.commons.io.IOUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;

public class BottomSheetAdapter extends RecyclerView.Adapter<BottomSheetAdapter.MyViewHolder> {
    // Context context;
    ArrayList<StatusModel> imagelist = new ArrayList<>();
    Context mainActivity;


    public BottomSheetAdapter(Context context, ArrayList<StatusModel> imageslist) {
        this.mainActivity = context;
        this.imagelist = imageslist;

    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item_bottom, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        if (imagelist.get(position).isVideo()) {
            holder.play.setVisibility(View.VISIBLE);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            Glide.with(mainActivity)
                    .load(imagelist.get(position).getDocumentFile().getUri())
                    // .load(imagelist.get(position).getDocumentFile().getUri())
                    .into(holder.img);
        } else {
            Glide.with(mainActivity).load(imagelist.get(position).getPath()).into(holder.img);

        }
        StatusModel statusModel = new StatusModel();
// this code to save te image and video
        holder.download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        if (!statusModel.isDownload()) {
                            copyFile(imagelist.get(position).getDocumentFile(), mainActivity);
                            holder.download.setImageResource(R.drawable.ic_tickarrow);
                            statusModel.setDownload(true);
                        }
                    } else {
                        if (!statusModel.isDownload()) {
                            copyFileBelow10(imagelist.get(position), holder.itemView.getContext());
                            holder.download.setImageResource(R.drawable.ic_tickarrow);
                            statusModel.setDownload(true);
                        }
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });

        holder.img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mainActivity, PreViewActivity.class);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    if (imagelist.get(position).getDocumentFile().getUri() != null) {
                        intent.putExtra("video_path", String.valueOf(imagelist.get(position).getDocumentFile().getUri()));
                    }
                } else {
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.putExtra("video_path", String.valueOf(imagelist.get(position).getPath()));
                }
                intent.putExtra("location", "MyStatus");
                mainActivity.startActivity(intent);


            }
        });

    }


    @Override
    public int getItemCount() {
        return imagelist.size();
    }

    static class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView img, download, play;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.img);
            download = itemView.findViewById(R.id.download);
            play = itemView.findViewById(R.id.play);

        }
    }


    @RequiresApi(api = Build.VERSION_CODES.O)
    public void copyFile(DocumentFile src, Context context) throws IOException {
        File file = new File(context.getExternalFilesDir("StatusDownloader").getPath());
        if (!file.exists()) {
            if (!file.mkdirs()) {

            }
        }
        String fileName;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        String currentDateTime = sdf.format(new Date());
        if (src.getUri().getPath().endsWith(".mp4")) {
            fileName = "VID_" + currentDateTime + ".mp4";
        } else {
            fileName = "IMG_" + currentDateTime + ".jpg";
        }
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                ContentValues values = new ContentValues();
                Uri destinationUri;
                values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
                values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/CVI_saver");
                Uri collectionUri;
                if (src.getUri().getPath().endsWith(".mp4")) {
                    values.put(MediaStore.MediaColumns.MIME_TYPE, "video/*");
                    collectionUri = MediaStore.Video.Media.getContentUri(
                            MediaStore.VOLUME_EXTERNAL_PRIMARY);
                } else {
                    values.put(MediaStore.MediaColumns.MIME_TYPE, "image/*");
                    collectionUri = MediaStore.Images.Media.getContentUri(
                            MediaStore.VOLUME_EXTERNAL_PRIMARY);
                }

                destinationUri = context.getContentResolver().insert(collectionUri, values);

                InputStream inputStream = context.getContentResolver().openInputStream(src.getUri());

                OutputStream outputStream = context.getContentResolver().openOutputStream(destinationUri);
                IOUtils.copy(inputStream, outputStream);
                Toast.makeText(context, "Download Successful", Toast.LENGTH_SHORT).show();
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void copyFileBelow10(StatusModel status, Context context) {

        File file = new File(context.getExternalFilesDir("StatusDownloader").getPath());
        if (!file.exists()) {
            if (!file.mkdirs()) {

            }
        }

        String fileName;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
        String currentDateTime = sdf.format(new Date());

        if (status.isVideo()) {
            fileName = "VID_" + currentDateTime + ".mp4";
        } else {
            fileName = "IMG_" + currentDateTime + ".jpg";
        }

        File destFile = new File(file + File.separator + fileName);

        try {

            org.apache.commons.io.FileUtils.copyFile(status.getFile(), destFile);
            //noinspection ResultOfMethodCallIgnored
            destFile.setLastModified(System.currentTimeMillis());
            new SingleMediaScanner(context, file);
            Toast.makeText(context, "Downloaded SuccessFull", Toast.LENGTH_SHORT).show();

//            Uri data = FileProvider.getUriForFile(context, context.getPackageName(),
//                    new File(destFile.getAbsolutePath()));


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
