# WebView Bridge Contract

This document defines the Android WebView bridge contract used by tenant builds like `tis`.

## Scope

- The bridge is enabled per tenant via `environment.enableNativeBridge`.
- Current tenant config:
  - `src/environments/environment.tis.ts` -> `enableNativeBridge: true`
  - other environments -> `false`

## JavaScript host objects

The web app checks bridge methods on:

1. `window.AndroidBridge`
2. `window.Android` (fallback)

Your Android app can expose either one.

## Required native methods

Expose these synchronous methods through `@JavascriptInterface`:

- `pay(payloadJson: String): String`
- `print(payloadJson: String): String`

Both methods must return a JSON string.

## Return JSON format

Success:

```json
{
  "success": true,
  "data": {}
}
```

Failure:

```json
{
  "success": false,
  "error": "Reason message"
}
```

If a non-JSON string is returned, the app treats it as success with raw data.

## Payload schemas

### pay(payload)

Called before invoice submit when terminal amount is greater than zero.

```json
{
  "amount": 1200000,
  "totalAmount": 3500000,
  "invoiceDate": "2026-04-27T10:30:00.000Z"
}
```

Fields:

- `amount` number: terminal payment amount.
- `totalAmount` number: full invoice total.
- `invoiceDate` string: ISO date-time.

### print(payload)

Called after successful invoice creation (and from invoice view print action).

```json
{
  "invoiceId": "a7e1f2...",
  "code": "INV-1745730090000"
}
```

Fields are optional, but should be used when available.

## Web behavior summary

- On native pay failure:
  - Invoice submit is stopped.
  - User sees warning toast.
- On native print failure or missing bridge:
  - In invoice page, app falls back to `window.print()`.
  - In POS checkout flow, print failure does not block successful submit.

## Android integration example (Kotlin)

```kotlin
class AndroidBridge(
    private val context: Context
) {
    @JavascriptInterface
    fun pay(payloadJson: String): String {
        return try {
            // TODO: parse payloadJson and run POS payment SDK synchronously
            """{"success":true,"data":{"txId":"12345"}}"""
        } catch (e: Exception) {
            """{"success":false,"error":"${e.message ?: "Payment failed"}"}"""
        }
    }

    @JavascriptInterface
    fun print(payloadJson: String): String {
        return try {
            // TODO: parse payloadJson and print with printer SDK
            """{"success":true}"""
        } catch (e: Exception) {
            """{"success":false,"error":"${e.message ?: "Print failed"}"}"""
        }
    }
}
```

Attach to WebView:

```kotlin
webView.settings.javaScriptEnabled = true
webView.addJavascriptInterface(AndroidBridge(this), "AndroidBridge")
```

## Notes

- For production, use HTTPS for web app + API to avoid mixed-content issues.
- Keep method names and payload keys exactly as specified.
