package app.chanora.poc.audio

import android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.File
import kotlin.concurrent.thread

/**
 * Chanora PoC — Android mobile audio spike.
 *
 * Two buttons:
 *   1) Play 500 ms 440 Hz sine wave through the default output device.
 *   2) Record 1 s from the default input device to app-private storage.
 *
 * Both call into the Rust cdylib via JNI. Status is logged to logcat
 * under the tag "ChanoraAudioPoC" (Rust) and "ChanoraPoCActivity"
 * (Kotlin). The UI also displays the result string.
 */
class MainActivity : Activity() {

    private companion object {
        const val TAG = "ChanoraPoCActivity"
        const val REQ_RECORD = 1001
    }

    private lateinit var status: TextView
    private lateinit var recordBtn: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Hand the Application Context to the Rust side BEFORE any
        // audio call, so cpal's Oboe backend can find Android audio
        // services via ndk_context.
        NativeAudio.initContext(applicationContext)

        val root = LinearLayout(this).apply {
            orientation = LinearLayout.VERTICAL
            setPadding(48, 48, 48, 48)
        }

        val title = TextView(this).apply {
            text = "Chanora Audio PoC (Android)"
            textSize = 20f
        }

        status = TextView(this).apply {
            text = "ready"
            textSize = 14f
            setPadding(0, 24, 0, 24)
        }

        val playBtn = Button(this).apply {
            text = "Play 500 ms sine"
            setOnClickListener { onPlay() }
        }

        recordBtn = Button(this).apply {
            text = "Record 1 s to file"
            setOnClickListener { onRecord() }
        }

        root.addView(title)
        root.addView(status)
        root.addView(playBtn)
        root.addView(recordBtn)
        setContentView(root)
    }

    private fun setStatus(s: String) {
        Log.i(TAG, s)
        runOnUiThread { status.text = s }
    }

    private fun onPlay() {
        setStatus("playing…")
        thread(name = "chanora-poc-play") {
            val frames = NativeAudio.playSine440(500L)
            if (frames < 0) {
                setStatus("PLAY ERROR (see logcat)")
            } else {
                setStatus("PLAY OK frames=$frames")
            }
        }
    }

    private fun onRecord() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECORD_AUDIO), REQ_RECORD)
            setStatus("requesting RECORD_AUDIO…")
            return
        }
        doRecord()
    }

    private fun doRecord() {
        setStatus("recording 1 s…")
        thread(name = "chanora-poc-record") {
            val path = File(filesDir, "chanora_poc_capture.wav").absolutePath
            val frames = NativeAudio.record1sToFile(path, 1000L)
            if (frames < 0) {
                setStatus("RECORD ERROR (see logcat)")
            } else {
                val sz = File(path).length()
                setStatus("RECORD OK frames=$frames bytes=$sz path=$path")
            }
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQ_RECORD) {
            if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) {
                doRecord()
            } else {
                setStatus("RECORD_AUDIO permission denied")
            }
        }
    }
}
