/*
 * SicMu Player - Lightweight music player for Android
 * Copyright (C) 2015  Mathieu Souchaud
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package souch.smp;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.util.Formatter;

public class Settings extends PreferenceActivity
        implements SharedPreferences.OnSharedPreferenceChangeListener,
        Preference.OnPreferenceClickListener
{
    private Parameters params;
    private MusicService musicSrv;
    private Intent playIntent;
    private boolean serviceBound = false;

    // todo: improve preference default value

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("Settings", "onCreate");
        super.onCreate(savedInstanceState);
        params = new ParametersImpl(this);
        // fixme: everything should be put in onResume?
        addPreferencesFromResource(R.xml.preferences);
        playIntent = new Intent(this, MusicService.class);
        bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);

        SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();

        String thresholdKeys = PrefKeys.SHAKE_THRESHOLD.name();
        EditTextPreference prefShakeThreshold = (EditTextPreference) findPreference(thresholdKeys);
        CheckBoxPreference prefEnableShake = (CheckBoxPreference) findPreference(PrefKeys.ENABLE_SHAKE.name());
        if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)) {
            prefShakeThreshold.setSummary(String.valueOf(params.getShakeThreshold()));
            prefEnableShake.setChecked(params.getEnableShake());
        }
        else {
            prefShakeThreshold.setEnabled(false);
            prefEnableShake.setEnabled(false);
            Toast.makeText(getApplicationContext(),
                    getResources().getString(R.string.settings_no_accelerometer),
                    Toast.LENGTH_LONG).show();
        }

        findPreference(PrefKeys.TEXT_SIZE_NORMAL.name()).setSummary(String.valueOf(params.getNormalTextSize()));
        findPreference(PrefKeys.TEXT_SIZE_BIG.name()).setSummary(String.valueOf(params.getBigTextSize()));
        findPreference(PrefKeys.TEXT_SIZE_RATIO.name()).setSummary(String.valueOf(params.getTextSizeRatio()));

        Preference rescan = findPreference(getResources().getString(R.string.settings_rescan_key));
        rescan.setOnPreferenceClickListener(this);

        Preference donate = findPreference(getResources().getString(R.string.settings_donate_key));
        donate.setOnPreferenceClickListener(this);

        setUnfoldSubgroup();
        setUnfoldThresholdSummary();

        String rootFoldersKey = PrefKeys.ROOT_FOLDERS.name();
        EditTextPreference prefRootFolders = (EditTextPreference) findPreference(rootFoldersKey);
        prefRootFolders.setSummary(params.getRootFolders());
        if(!sharedPreferences.contains(rootFoldersKey))
            prefRootFolders.setText(Path.getMusicStoragesStr(getBaseContext()));

        setFoldSummary();

        this.onContentChanged();
    }



    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if(!serviceBound)
            return;
        Log.d("MusicService", "onSharedPreferenceChanged: " + key);

        if(key.equals(PrefKeys.DEFAULT_FOLD.name())) {
            setFoldSummary();
        }
        else if(key.equals(PrefKeys.TEXT_SIZE_NORMAL.name())) {
            findPreference(key).setSummary(String.valueOf(params.getNormalTextSize()));
            Main.applyTextSize(params);
            musicSrv.setChanged();
        }
        else if(key.equals(PrefKeys.TEXT_SIZE_BIG.name())) {
            findPreference(key).setSummary(String.valueOf(params.getBigTextSize()));
            Main.applyTextSize(params);
            musicSrv.setChanged();
        }
        else if(key.equals(PrefKeys.TEXT_SIZE_RATIO.name())) {
            findPreference(key).setSummary(String.valueOf(String.valueOf(params.getTextSizeRatio())));
            Main.applyTextSize(params);
            musicSrv.setChanged();
        }
        else if(key.equals(PrefKeys.ENABLE_SHAKE.name())) {
            musicSrv.setEnableShake(params.getEnableShake());
        }
        else if(key.equals(PrefKeys.SHAKE_THRESHOLD.name())) {
            final float threshold = params.getShakeThreshold();
            musicSrv.setShakeThreshold(threshold);
            findPreference(key).setSummary(String.valueOf(threshold));
        }
        else if(key.equals(PrefKeys.UNFOLD_SUBGROUP.name())) {
            setUnfoldSubgroup();
        }
        else if(key.equals(PrefKeys.UNFOLD_SUBGROUP_THRESHOLD.name())) {
            setUnfoldThresholdSummary();
        }
        else if(key.equals(PrefKeys.ROOT_FOLDERS.name())) {
            final String rootFolder = params.getRootFolders();
            findPreference(key).setSummary(rootFolder);
            if(!(new File(rootFolder)).exists()) {
                Formatter formatter = new Formatter();
                formatter.format(getResources().getString(R.string.settings_root_folder_summary),
                        rootFolder);
                Toast.makeText(getApplicationContext(),
                                formatter.toString(),
                                Toast.LENGTH_LONG).show();
            }
            boolean reinited = musicSrv.getRows().setRootFolders(rootFolder);
            if(reinited)
                musicSrv.setChanged();
        }
    }

    private void setUnfoldSubgroup() {
        findPreference(PrefKeys.UNFOLD_SUBGROUP_THRESHOLD.name()).setEnabled(!params.getUnfoldSubGroup());
    }

    private void setUnfoldThresholdSummary() {
        Formatter formatter = new Formatter();
        formatter.format(getResources().getString(R.string.settings_unfold_subgroup_threshold_summary),
                params.getUnfoldSubGroupThreshold());
        findPreference(PrefKeys.UNFOLD_SUBGROUP_THRESHOLD.name()).setSummary(formatter.toString());
    }

    private void setFoldSummary() {
        int idx = params.getDefaultFold();
        ListPreference prefFold = (ListPreference) findPreference(PrefKeys.DEFAULT_FOLD.name());
        String[] foldEntries = getResources().getStringArray(R.array.settings_fold_entries);
        if (idx >= foldEntries.length)
            idx = foldEntries.length - 1;
        if (idx >= 0)
            prefFold.setSummary(foldEntries[idx]);
    }

    private void showDonateWebsite() {
        Intent webIntent = new Intent(Intent.ACTION_VIEW);
        webIntent.setData(Uri.parse(getString(R.string.settings_donate_www)));
        this.startActivity(webIntent);
    }

    private ServiceConnection musicConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("Settings", "onServiceConnected");
            MusicService.MusicBinder binder = (MusicService.MusicBinder) service;
            musicSrv = binder.getService();
            serviceBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("Settings", "onServiceDisconnected");
            serviceBound = false;
        }
    };

    @Override
    protected void onDestroy() {
        unbindService(musicConnection);
        serviceBound = false;
        musicSrv = null;
        super.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        if(preference.getKey().equals(getResources().getString(R.string.settings_rescan_key))) {
            rescan();
        } else if (preference.getKey().equals(getResources().getString(R.string.settings_donate_key))) {
            showDonateWebsite();
        }
        return false;
    }

    public void rescan() {
        Path.rescanWhole(getBaseContext());
    }

}