package com.example.stage_app.screen

import android.webkit.WebView
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.hilt.navigation.compose.hiltViewModel
import com.example.core.getAndroidId
import com.example.core.getDeviceName
import com.example.design_system.PspWebView
import com.example.stage_app.viewmodel.StageViewModel

private const val tisIp = "192.168.128.73:5000"

@Composable
fun StageWebViewScreen(
    modifier: Modifier = Modifier,
    viewModel: StageViewModel = hiltViewModel()
) {

    val context = LocalContext.current
    var webView: WebView? by remember { mutableStateOf(null) }
    var currentPaymentId by rememberSaveable { mutableStateOf<String?>(null) }

    // launcher to handle POS app result
    val posLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.StartActivityForResult()
    ) { result ->
        val paymentResultEntity = viewModel.paymentResult(
            id = currentPaymentId,
            activityResult = result

        )
        webView?.post {
            webView?.evaluateJavascript(
                viewModel.postPaymentResult(paymentResultEntity = paymentResultEntity),
                null
            )
        }

    }

    PspWebView(
        url = tisIp,
        webView = webView,
        modifier = modifier,
        onWebView = { updatedWebView -> webView = updatedWebView },
        onPayClick = { amount: Long, id: String? ->
            currentPaymentId = id
            viewModel.pay(amount)
                .also(posLauncher::launch)
        },
        onPrintClick = { printEntities ->
            viewModel.print(printEntities)

        },
        onDeviceInfo = {
            viewModel.deviceInfoJson(
                androidId = getAndroidId(context),
                getDeviceName()
            )
        }
    )
}