package com.gtp.showapicturetoyourfriend;

import android.Manifest;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.MimeTypeMap;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.kobakei.ratethisapp.RateThisApp;

import java.util.ArrayList;

public class receiverpictureactivity extends AppCompatActivity {

    //to make sure back button doesn't open old images
    @Override
    protected void onNewIntent(Intent intent) {
    finish();
    startActivity(intent);
    }

    Handler handly;
    Runnable goahead;
    int page = 0;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //makes Window Fullscreen and show ontop of the Lockscreen
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_receiverpictureactivity);
        Window wind = this.getWindow();
        wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        wind.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        if (savedInstanceState != null) {
            if (savedInstanceState.getBoolean("ready", false)) {
                page = savedInstanceState.getInt("pageItem", 0);
                screenislocked();
            }
        }

        RateThisApp.onCreate(this);
        RateThisApp.showRateDialogIfNeeded(this);

        //periodically checks if the screen is locked, if it is calls screenislocked()
        handly = new Handler();
        goahead = new Runnable() {
            @Override
            public void run() {
                KeyguardManager myKM = (KeyguardManager) getApplication().getSystemService(Context.KEYGUARD_SERVICE);
                if (myKM != null) {
                    if( myKM.inKeyguardRestrictedInputMode()) {
                        screenislocked();
                    } else {
                        handly.postDelayed(goahead, 40);
                    }
                } else {
                    handly.postDelayed(goahead, 40);
                }
            }
        };
        goahead.run();

    }

    public void buttonpressed(View view) { //called when button is pressed
        screenislocked();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mViewPager != null) {
            outState.putInt("pageItem", mViewPager.getCurrentItem());
            outState.putBoolean("ready", true);
        } else {
            outState.putBoolean("ready", false);
        }
    }

    public void screenislocked() {

        if (handly != null) {
            handly.removeCallbacks(goahead);
        }

        PowerManager.WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        screenLock.acquire(1);

        screenLock.release();
        //removes handler, wakes up screen and realeases Wakelock immediately

        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();

        setContentView(R.layout.activity_receivemultiple);

        ArrayList<Uri> imageUris = null;

        if(Intent.ACTION_SEND.equals(action)) { //puts Uris into an array, whether there is one or multiple
            Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
            imageUris = new ArrayList<>();
            imageUris.add(imageUri);
        } else if(Intent.ACTION_SEND_MULTIPLE.equals(action)) {
            imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        } //puts Uris into an array, whether there is one or multiple

        DemoCollectionPagerAdapter.setCounts(imageUris.size());
        DemoCollectionPagerAdapter.setUris(imageUris, this);

        PagerAdapter mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getSupportFragmentManager());
        DemoCollectionPagerAdapter.setAdapter(mDemoCollectionPagerAdapter);
        mViewPager = findViewById(R.id.pager);
        mViewPager.setOffscreenPageLimit(2);
        mViewPager.setAdapter(mDemoCollectionPagerAdapter);

        mViewPager.setCurrentItem(page);
    }

    @Override
    protected void onDestroy() {
        handly.removeCallbacks(goahead);
        super.onDestroy();
    }

    public static class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
        public DemoCollectionPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        static ArrayList<Uri> uris;
        static Context context;

        public static void recreateafterpermission() { //this is called when the user gives permission to view file
            atp.notifyDataSetChanged();
        }

        public static void setUris(ArrayList<Uri> muri, Context c) {
            uris=muri;
            context = c;
        }

        public static void setAdapter(PagerAdapter adapter) {
            atp = adapter;
        }
        static PagerAdapter atp;

        @Override
        public Fragment getItem(int i) {
            Fragment fragment = new DemoObjectFragment();
            Bundle args = new Bundle();

            Uri uri = uris.get(i);
            String stringuri = "";
            if(uri != null) {
                stringuri = uri.toString();
            } else {
                Toast.makeText(context, R.string.invalid, Toast.LENGTH_LONG).show();
            }

            args.putString("Uri",stringuri);
            fragment.setArguments(args);
            return fragment;
        }

        static int count;

        @Override
        public int getCount() {
            return count;
        }

        public static void setCounts(int mcount) {
            count = mcount;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return "OBJECT " + (position + 1);
        }
    }

    public static class DemoObjectFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View rootView = null;

            Bundle args = getArguments();
            String forUri = args.getString("Uri");
            Uri urinormal = Uri.parse(forUri);

            String type = null;
            String extension = MimeTypeMap.getFileExtensionFromUrl(forUri.replace("~",""));
            if (extension != null) {
                type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
            }

            String startwith = getActivity().getContentResolver().getType(urinormal);

            if(startwith!=null) {
                if (startwith.startsWith("image/")) {
                    rootView = inflater.inflate(R.layout.adapterimage, container, false);
                    pictureSet((TouchImageView) rootView.findViewById(R.id.touchImageView), urinormal);
                } else if (startwith.startsWith("video/")) {
                    rootView = inflater.inflate(R.layout.adaptervideo, container, false);
                    videoSet((VideoView) rootView.findViewById(R.id.videoview), urinormal);
                }
            } else {
                if(type!=null) {
                    if (Build.VERSION.SDK_INT >= 23) {
                        if (getActivity().checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                            rootView=typeMethod(rootView,urinormal,container,type,inflater);
                        } else {
                            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                            Toast.makeText(getActivity(), R.string.permission, Toast.LENGTH_LONG).show();
                        }
                    } else {
                        rootView=typeMethod(rootView,urinormal,container,type,inflater);
                    }
                }
            }

            if(viewvisibleinoncreate) {
                viewnowvisible(true);
            }

            return rootView;

        }

        private View typeMethod(View rootView, Uri urinormal, ViewGroup container, String type,LayoutInflater inflater) {
            if (type.startsWith("image/")) {
                rootView = inflater.inflate(R.layout.adapterimage, container, false);
                pictureSetFile((TouchImageView) rootView.findViewById(R.id.touchImageView), urinormal);
            } else if (type.startsWith("video/")) {
                rootView = inflater.inflate(R.layout.adaptervideo, container, false);
                videoSet((VideoView) rootView.findViewById(R.id.videoview), urinormal);
            }
            return rootView;
        }

        private void pictureSet(final TouchImageView imageset, Uri urinormal) {

            imageset.setMaxZoom(30);

            Glide.with(this)
                    .load(urinormal)
                    .override(2000, 2000)
                    //.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .into(new GlideDrawableImageViewTarget(imageset) {
                        @Override
                        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {
                            super.onResourceReady(resource, animation);
                            imageset.setZoom(1);
                        }
                    })
            ;
        }

        private void pictureSetFile(final TouchImageView imageset, Uri urinormal) {
            imageset.setMaxZoom(30);

            Glide.with(this)
                    .load(urinormal)
                    .override(2000, 2000)
                    //.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .into(new GlideDrawableImageViewTarget(imageset) {
                        @Override
                        public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> animation) {
                            super.onResourceReady(resource, animation);
                            imageset.setZoom(1);
                        }
                    })
            ;
        }

        private void videoSet(VideoView video, Uri urinormal) {
            video.setVideoURI(urinormal);
            video.seekTo(1);
            controller = new MediaController(getActivity());
            videow = video;
            isvideo = true;
        }

        VideoView videow;
        MediaController controller;
        Boolean viewvisibleinoncreate = false;
        Boolean isvideo = false;
        Boolean iscontrollershowing = false;

        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (getView() != null) {
                viewnowvisible(isVisibleToUser);
            } else {
                viewvisibleinoncreate = isVisibleToUser;
            }
        }

        public void viewnowvisible(boolean isVisibleToUser) {
            if (isvideo) {
                if(isVisibleToUser) {
                    Log.d("r","VIDEO ON");
                    if(iscontrollershowing) {
                        controller.show();
                    } else {
                        controller.setAnchorView(videow);
                        controller.setMediaPlayer(videow);
                        videow.setMediaController(controller);
                        iscontrollershowing = true;
                    }
                    videow.start();
                } else {
                    Log.d("r","VIDEO OFF");
                    videow.pause();
                    controller.hide();
                }
            }
        }

    }
}