package com.sahdeepsingh.Bop.Activities;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.sahdeepsingh.Bop.Adapters.ThemeAdapter;
import com.sahdeepsingh.Bop.BopUtils.ExtraUtils;
import com.sahdeepsingh.Bop.BopUtils.ThemeUtil;
import com.sahdeepsingh.Bop.Handlers.DefaultSPHandler;
import com.sahdeepsingh.Bop.R;
import com.sahdeepsingh.Bop.fragments.AdvancedSettings;
import com.sahdeepsingh.Bop.playerMain.Main;
import com.sahdeepsingh.Bop.settings.Theme;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class SettingActivity extends BaseActivity implements AdvancedSettings.OnFragmentInteractionListener {

    public static List<Theme> mThemeList = new ArrayList<>();
    public static int selectedTheme = 0;
    LinearLayout mode, theme, blockfolder;
    MaterialCheckBox pauseHeadphoneUnplugged, resumeHeadphonePlugged, headphoneControl, saveRecent, savePlaylist, saveCount;
    LinearLayout llBottomSheet;
    private RecyclerView mRecyclerView;
    private ThemeAdapter mAdapter;
    private BottomSheetBehavior mBottomSheetBehavior;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(ExtraUtils.getThemedIcon(this, getDrawable(R.drawable.ic_backarrow)));
        Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onBackPressed();
            }
        });

        mode = findViewById(R.id.settingsMode);
        theme = findViewById(R.id.settingsTheme);
        pauseHeadphoneUnplugged = findViewById(R.id.pauseHeadphoneUnplugged);
        resumeHeadphonePlugged = findViewById(R.id.resumeHeadphonePlugged);
        headphoneControl = findViewById(R.id.headphoneControl);
        saveRecent = findViewById(R.id.saveRecent);
        saveCount = findViewById(R.id.saveCount);
        savePlaylist = findViewById(R.id.savePlaylist);
        blockfolder = findViewById(R.id.blockFolder);
        llBottomSheet = findViewById(R.id.bottom_sheet);
        mBottomSheetBehavior = BottomSheetBehavior.from(llBottomSheet);
        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
        TextView slds = findViewById(R.id.curVersion);
        slds.setText(Main.versionName);
        setupCheckBoxes();
        setListeners();

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            case R.id.resetSetting:
                resetDialog();
                return true;

        }
        return false;

    }

    private void resetDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
        builder.setTitle("Reset App Settings");
        builder.setMessage("It will reset In-App Settings. Also Recent Songs, Counts and Last Played Playlist will be Deleted!");
        builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Main.settings.reset();
                Toast.makeText(SettingActivity.this, "Reset Complete", Toast.LENGTH_SHORT).show();
                recreate();
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    private void setupCheckBoxes() {
        pauseHeadphoneUnplugged.setChecked(Main.settings.get("pauseHeadphoneUnplugged", true));
        resumeHeadphonePlugged.setChecked(Main.settings.get("resumeHeadphonePlugged", true));
        headphoneControl.setChecked(Main.settings.get("headphoneControl", true));
        saveRecent.setChecked(Main.settings.get("saveRecent", true));
        saveCount.setChecked(Main.settings.get("saveCount", true));
        savePlaylist.setChecked(Main.settings.get("savePlaylist", true));
    }

    private void setListeners() {

        mode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showModeDialog();
            }
        });

        theme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changeTheme();
            }
        });

        pauseHeadphoneUnplugged.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Main.settings.set("pauseHeadphoneUnplugged", true);
                } else {
                    Main.settings.set("pauseHeadphoneUnplugged", false);
                }
            }
        });

        resumeHeadphonePlugged.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    Main.settings.set("resumeHeadphonePlugged", true);
                } else {
                    Main.settings.set("resumeHeadphonePlugged", false);
                }

            }
        });

        headphoneControl.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    Main.settings.set("headphoneControl", true);
                } else {
                    Main.settings.set("headphoneControl", false);
                }

            }
        });

        saveRecent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    Main.settings.set("saveRecent", true);
                } else {
                    Main.settings.set("saveRecent", false);
                }

            }
        });

        saveCount.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    Main.settings.set("saveCount", true);
                } else {
                    Main.settings.set("saveCount", false);
                }
            }
        });

        savePlaylist.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (isChecked) {
                    Main.settings.set("savePlaylist", true);
                } else {
                    Main.settings.set("savePlaylist", false);
                }

            }
        });

        mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                switch (newState) {
                    case BottomSheetBehavior.STATE_HIDDEN:
                        break;
                    case BottomSheetBehavior.STATE_EXPANDED: {
                    }
                    break;
                    case BottomSheetBehavior.STATE_COLLAPSED: {
                        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
                    }
                    break;
                    case BottomSheetBehavior.STATE_DRAGGING:
                        break;
                    case BottomSheetBehavior.STATE_SETTLING:
                        break;
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {

            }
        });
        blockfolder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);

                // Filter to only show results that can be "opened", such as
                // a file (as opposed to a list of contacts or timezones).
                intent.addCategory(Intent.CATEGORY_OPENABLE);

                // Create a file with the requested MIME type.
                intent.setType("lol/lol");
                intent.putExtra(Intent.EXTRA_TITLE, ".nomedia");
                startActivityForResult(intent, 1122);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1122 && data != null) {
            DefaultSPHandler spHandler = new DefaultSPHandler(getApplicationContext());
            ArrayList<String> lol = spHandler.getListString("blockedURIs");
            if (lol == null)
                lol = new ArrayList<>();
            lol.add(data.getData().toString());
            spHandler.putListString("blockedURIs", lol);
        }
    }

    private void changeTheme() {
        selectedTheme = ThemeUtil.getCurrentActiveTheme();

        openBottomSheet();
        prepareThemeData();
        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
    }

    private void openBottomSheet() {

        mRecyclerView = findViewById(R.id.recyclerViewBottomSheet);

        mAdapter = new ThemeAdapter(mThemeList);

        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(), 4);
        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.setAdapter(mAdapter);
    }

    private void prepareThemeData() {
        mThemeList.clear();
        mThemeList.addAll(ThemeUtil.getThemeList());
        mAdapter.notifyDataSetChanged();
    }

    private void showModeDialog() {
        CharSequence[] values = {"Day Mode", "Night Mode"};
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
        builder.setTitle("Set Day/Night Mode");
        int checkeditem = Main.settings.get("modes", "Day").equals("Day") ? 0 : 1;
        int[] newcheckeditem = {checkeditem};
        builder.setSingleChoiceItems(values, checkeditem, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int item) {
                        switch (item) {
                            case 0:
                                newcheckeditem[0] = 0;
                                break;
                            case 1:
                                newcheckeditem[0] = 1;
                                break;

                        }
                    }
                }
        );

        builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (checkeditem == newcheckeditem[0]) {
                    dialog.dismiss();
                } else {
                    if (newcheckeditem[0] == 1) {
                        Main.settings.set("modes", "Night");
                    } else {
                        Main.settings.set("modes", "Day");
                    }
                    Toast.makeText(SettingActivity.this, "Changes Made", Toast.LENGTH_SHORT).show();
                    recreate();
                }
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.settingsmenu, menu);
        return true;
    }

    public void sendFeedback(View view) {
        ExtraUtils.sendFeedback(SettingActivity.this);
    }

    public void gotoFAQ(View view) {
        ExtraUtils.openCustomTabs(SettingActivity.this, "https://github.com/iamSahdeep/Bop/blob/master/FAQs.md");
    }

    public void gotoPP(View view) {
        ExtraUtils.openCustomTabs(SettingActivity.this, "https://github.com/iamSahdeep/Bop/blob/master/privacy_policy.md");
    }

    public void gotoGithub(View view) {
        ExtraUtils.openCustomTabs(SettingActivity.this, "https://github.com/iamSahdeep/Bop");
    }

    public void cancelTheme(View view) {
        mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
    }

    public void saveTheme(View view) {
        Main.settings.set("themes", getResources().getStringArray(R.array.themes_values)[selectedTheme]);
        Toast.makeText(SettingActivity.this, "Changes Made", Toast.LENGTH_SHORT).show();
        recreate();
    }

    public void AdvancedFragment(View view) {
        findViewById(R.id.scrollSettings).setVisibility(View.GONE);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.replaceAdvaced, AdvancedSettings.newInstance("", "")).addToBackStack(null).commit();
    }

    @Override
    public void onBackPressed() {
        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStack();
            findViewById(R.id.scrollSettings).setVisibility(View.VISIBLE);
        } else super.onBackPressed();
    }

    @Override
    public void onFragmentInteraction(String what) {
        if (what.equals("jump")) {
            createFWDialog();
        } else if (what.equals("rescan")) {
            rescanMediaStore();
        } else if (what.equals("sleep")) {
            createSTdialog();
        }
    }

    private void createSTdialog() {
        CharSequence[] values = {"5 min", "10 min", "15 min", "20 min", "25 min"};
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
        builder.setTitle("Set Sleep timer to close music player if paused");
        int checkeditem = Main.settings.get("sleepTimer", 5);
        int[] newcheckeditem = {checkeditem};
        builder.setSingleChoiceItems(values, (checkeditem / 5) - 1, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int item) {
                        newcheckeditem[0] = item;
                    }
                }
        );

        builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (checkeditem == newcheckeditem[0]) {
                    dialog.dismiss();
                } else {
                    if (newcheckeditem[0] == 0) {
                        Main.settings.set("sleepTimer", 5);
                    } else if (newcheckeditem[0] == 1) {
                        Main.settings.set("sleepTimer", 10);
                    } else if (newcheckeditem[0] == 2) {
                        Main.settings.set("sleepTimer", 15);
                    } else if (newcheckeditem[0] == 3) {
                        Main.settings.set("sleepTimer", 20);
                    } else if (newcheckeditem[0] == 4) {
                        Main.settings.set("sleepTimer", 25);
                    } else {
                        Main.settings.set("sleepTimer", 5);
                    }
                    Toast.makeText(SettingActivity.this, "Changes Made", Toast.LENGTH_SHORT).show();
                }
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    private void createFWDialog() {
        CharSequence[] values = {"5 sec", "10 sec", "15 sec", "20 sec", "25 sec"};
        AlertDialog.Builder builder = new AlertDialog.Builder(SettingActivity.this);
        builder.setTitle("Set jump value in forwar/rewind");
        int checkeditem = Main.settings.get("jumpValue", 10);
        int[] newcheckeditem = {checkeditem};
        builder.setSingleChoiceItems(values, (checkeditem / 5) - 1, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int item) {
                        newcheckeditem[0] = item;
                    }
                }
        );

        builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                if (checkeditem == newcheckeditem[0]) {
                    dialog.dismiss();
                } else {
                    if (newcheckeditem[0] == 0) {
                        Main.settings.set("jumpValue", 5);
                    } else if (newcheckeditem[0] == 1) {
                        Main.settings.set("jumpValue", 10);
                    } else if (newcheckeditem[0] == 2) {
                        Main.settings.set("jumpValue", 15);
                    } else if (newcheckeditem[0] == 3) {
                        Main.settings.set("jumpValue", 20);
                    } else if (newcheckeditem[0] == 4) {
                        Main.settings.set("jumpValue", 25);
                    } else {
                        Main.settings.set("jumpValue", 10);
                    }

                    Toast.makeText(SettingActivity.this, "Changes Made", Toast.LENGTH_SHORT).show();
                }
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });

        AlertDialog alertDialog = builder.create();
        alertDialog.show();
    }

    private void rescanMediaStore() {
        ProgressDialog lol = new ProgressDialog(SettingActivity.this);
        lol.setMessage("Sending BroadCast to Scan");
        lol.setCancelable(false);
        lol.show();
        MediaScannerConnection.scanFile(
                getApplicationContext(),
                new String[]{"file://" + Environment.getExternalStorageDirectory()},
                new String[]{"audio/mp3", "audio/*"},
                new MediaScannerConnection.MediaScannerConnectionClient() {
                    public void onMediaScannerConnected() {

                    }

                    public void onScanCompleted(String path, Uri uri) {
                        lol.cancel();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(SettingActivity.this, "Remove from recents and restart application", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });

    }
}