package su.timoxa0.linuxswitch

import android.annotation.SuppressLint
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import com.topjohnwu.superuser.Shell

class MainActivity : AppCompatActivity() {
    companion object {
        fun showToast(text: String, applicationContext: Context) {
            Toast.makeText(applicationContext, text, Toast.LENGTH_SHORT).show()
        }

        fun switch(applicationContext: Context) {
            Log.i("SwitchToLinux", "switching to linux")

            val suffix: String = Shell.cmd("getprop ro.boot.slot_suffix").exec().out[0].toString()

            showToast("Switching!", applicationContext)

            Shell.cmd(
                "dd if=/sdcard/linux/linux.dtbo.img of=/dev/block/bootdevice/by-name/dtbo$suffix",
                "dd if=/sdcard/linux/linux.boot.img of=/dev/block/bootdevice/by-name/boot$suffix",
                "dd if=/sdcard/linux/linux.vbmeta.img of=/dev/block/bootdevice/by-name/vbmeta$suffix",
                "sleep 1",
                "svc power reboot"
            ).exec()
        }
    }
    private fun isFileExist(path: String): Boolean {
        return if (path.endsWith("/")) {
            Shell.cmd("test -d %s".format(path)).exec().isSuccess
        } else {
            Shell.cmd("test -f %s".format(path)).exec().isSuccess
        }
    }

    @SuppressLint("SdCardPath", "SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val buttonS2L = findViewById<Button>(R.id.button_switch)
        val buttonDump = findViewById<Button>(R.id.button_dump)
        val textSlot = findViewById<TextView>(R.id.text_slot)

        Shell.getShell()

        if (Shell.isAppGrantedRoot() == true) {

            val suffix: String = Shell.cmd("getprop ro.boot.slot_suffix").exec().out[0].toString()

            buttonS2L.isEnabled = true
            if (!isFileExist("/sdcard/linux/")) {
                Shell.cmd("mkdir /sdcard/linux/").exec()
            }
            if (!isFileExist("/sdcard/linux/linux.dtbo.img")) {
                showToast("linux.dtbo.img not found", applicationContext)
                finish()
            } else if (!isFileExist("/sdcard/linux/linux.vbmeta.img")) {
                showToast("linux.vbmeta.img bot found", applicationContext)
                finish()
            } else if (!isFileExist("/sdcard/linux/linux.boot.img")) {
                showToast("linux.boot.img not found", applicationContext)
                finish()
            }

            textSlot.text = this.resources.getString(R.string.slot_text).format(suffix[1])

        } else {
            finish()
        }


        buttonS2L.setOnClickListener {
            switch(applicationContext)
            finish()
        }

        buttonDump.setOnClickListener {
            Log.i("SwitchToLinux","dumping images")
            val suffix: String = Shell.cmd("getprop ro.boot.slot_suffix").exec().out[0].toString()

            Shell.cmd(
                "dd if=/dev/block/bootdevice/by-name/dtbo$suffix of=/sdcard/linux/android.dtbo.img ",
                "dd if=/dev/block/bootdevice/by-name/boot$suffix of=/sdcard/linux/android.boot.img",
            ).exec()

            showToast("Android images dumped to /sdcard/linux/", applicationContext)
        }
    }
}