# PATCH no `DetalheScreen.kt` - FASE 3

A ideia desta fase é NÃO mexer no que já funciona.
Você só vai acrescentar:

1. botão **Ciência local** para abrir a assinatura
2. botão **OS / PDF** para abrir a ordem de serviço no navegador
3. suporte para enviar assinatura em base64 para o portal
4. exibição do assinante no detalhe

---

## 1) imports novos
Adicione:

```kotlin
import android.content.Intent
import android.net.Uri
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
```

E também o arquivo novo:
- `SignaturePadDialog.kt`
- `AssinaturaUtils.kt`

---

## 2) estados novos dentro da tela
Adicione dentro do composable do detalhe:

```kotlin
var abrirAssinatura by remember { mutableStateOf(false) }
var enviandoAssinatura by remember { mutableStateOf(false) }
```

---

## 3) botão para abrir OS
No bloco de ações do chamado, adicione um botão:

```kotlin
Button(onClick = {
    val url = chamado?.urlOsImpressao
    if (!url.isNullOrBlank()) {
        val full = if (url.startsWith("http")) url else ApiConfig.BASE_URL.removeSuffix("api/") + url
        ctx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(full)))
    }
}) {
    Text("OS / PDF")
}
```

---

## 4) botão para assinatura local
Ainda no bloco de ações:

```kotlin
Button(onClick = { abrirAssinatura = true }) {
    Text("Ciência local")
}
```

---

## 5) dialog da assinatura
No final da tela:

```kotlin
if (abrirAssinatura) {
    SignaturePadDialog(
        onDismiss = { abrirAssinatura = false },
        onSave = { nome, documento, observacao, bitmap ->
            abrirAssinatura = false
            val base64 = AssinaturaUtils.bitmapToBase64Png(bitmap)
            scope.launch {
                enviandoAssinatura = true
                try {
                    val resp = api.salvarAssinatura(
                        AssinaturaPayload(
                            chamadoId = chamadoId,
                            nomeAssinante = nome,
                            documentoAssinante = documento.ifBlank { null },
                            observacao = observacao.ifBlank { null },
                            assinaturaBase64 = base64
                        )
                    )
                    mensagemFeedback = resp.message ?: if (resp.success) "Assinatura salva." else "Falha ao salvar assinatura."
                    carregarDados()
                } catch (e: Exception) {
                    mensagemFeedback = "Erro ao enviar assinatura: ${e.message}"
                } finally {
                    enviandoAssinatura = false
                }
            }
        }
    )
}
```

---

## 6) mostrar assinatura no detalhe
No bloco visual do chamado, exiba:

```kotlin
Text("Assinante: ${chamado?.assinaturaLocalNome ?: "-"}")
Text("Documento: ${chamado?.assinaturaLocalDocumento ?: "-"}")
Text("Assinado em: ${chamado?.assinaturaLocalEm ?: "-"}")
```

---

## 7) motivo de encerramento
Quando for concluir/encerrar, passe também o `motivo_encerramento` no `updateChamado`.
A assinatura pode ser coletada antes do encerramento ou logo após a conclusão técnica.
