package com.stevesoltys.backup.settings

import android.app.backup.IBackupManager
import android.content.ContentResolver
import android.os.Bundle
import android.os.RemoteException
import android.provider.Settings
import android.util.Log

import androidx.preference.PreferenceFragmentCompat
import androidx.preference.TwoStatePreference

import com.stevesoltys.backup.R

import android.content.Context.BACKUP_SERVICE
import android.os.ServiceManager.getService
import android.provider.Settings.Secure.BACKUP_AUTO_RESTORE
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.lifecycle.ViewModelProviders
import androidx.preference.Preference
import androidx.preference.Preference.OnPreferenceChangeListener

private val TAG = SettingsFragment::class.java.name

class SettingsFragment : PreferenceFragmentCompat() {

    private lateinit var backupManager: IBackupManager

    private lateinit var viewModel: SettingsViewModel

    private lateinit var backup: TwoStatePreference
    private lateinit var autoRestore: TwoStatePreference

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.settings, rootKey)
        setHasOptionsMenu(true)

        backupManager = IBackupManager.Stub.asInterface(getService(BACKUP_SERVICE))

        viewModel = ViewModelProviders.of(requireActivity()).get(SettingsViewModel::class.java)

        backup = findPreference("backup") as TwoStatePreference
        backup.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->
            val enabled = newValue as Boolean
            try {
                backupManager.isBackupEnabled = enabled
                return@OnPreferenceChangeListener true
            } catch (e: RemoteException) {
                e.printStackTrace()
                backup.isChecked = !enabled
                return@OnPreferenceChangeListener false
            }
        }

        val backupLocation = findPreference("backup_location")
        backupLocation.setOnPreferenceClickListener {
            viewModel.chooseBackupLocation()
            true
        }

        autoRestore = findPreference("auto_restore") as TwoStatePreference
        autoRestore.onPreferenceChangeListener = OnPreferenceChangeListener { _, newValue ->
            val enabled = newValue as Boolean
            try {
                backupManager.setAutoRestore(enabled)
                return@OnPreferenceChangeListener true
            } catch (e: RemoteException) {
                Log.e(TAG, "Error communicating with BackupManager", e)
                autoRestore.isChecked = !enabled
                return@OnPreferenceChangeListener false
            }
        }
    }

    override fun onStart() {
        super.onStart()

        // we need to re-set the title when returning to this fragment
        requireActivity().setTitle(R.string.app_name)

        try {
            backup.isChecked = backupManager.isBackupEnabled
            backup.isEnabled = true
        } catch (e: RemoteException) {
            Log.e(TAG, "Error communicating with BackupManager", e)
            backup.isEnabled = false
        }

        val resolver = requireContext().contentResolver
        autoRestore.isChecked = Settings.Secure.getInt(resolver, BACKUP_AUTO_RESTORE, 1) == 1
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater.inflate(R.menu.settings_menu, menu)
        if (resources.getBoolean(R.bool.show_restore_in_settings)) {
            menu.findItem(R.id.action_restore).isVisible = true
        }
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean = when {
        item.itemId == R.id.action_backup -> {
            Toast.makeText(requireContext(), "Not yet implemented", Toast.LENGTH_SHORT).show()
            true
        }
        item.itemId == R.id.action_restore -> {
            Toast.makeText(requireContext(), "Not yet implemented", Toast.LENGTH_SHORT).show()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }

}