package com.isp.bkashautomation.network import android.content.Context import android.util.Log import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.google.gson.Gson import com.isp.bkashautomation.security.SecurityHelper import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import java.util.concurrent.TimeUnit class NetworkWorker( context: Context, params: WorkerParameters ) : CoroutineWorker(context, params) { private val client = OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build() private val gson = Gson() override suspend fun doWork(): Result { val serverUrl = inputData.getString("SERVER_URL") ?: return Result.failure() val secretKey = inputData.getString("SECRET_KEY") ?: return Result.failure() val rawSms = inputData.getString("RAW_SMS") ?: return Result.failure() val trxId = inputData.getString("TRX_ID") val amount = inputData.getDouble("AMOUNT", 0.0) val reference = inputData.getString("REFERENCE") val timestamp = System.currentTimeMillis().toString() val signature = SecurityHelper.generateHmacSha256("$timestamp:$rawSms", secretKey) val payload = mapOf( "rawSmsOrNotification" to rawSms, "trxId" to trxId, "amount" to amount, "reference" to reference, "timestamp" to timestamp, "signature" to signature ) val requestBody = gson.toJson(payload).toRequestBody("application/json; charset=utf-8".toMediaType()) val request = Request.Builder() .url(serverUrl) .addHeader("X-ISP-Signature", signature) .addHeader("X-ISP-Timestamp", timestamp) .post(requestBody) .build() return try { val response = client.newCall(request).execute() if (response.isSuccessful) { Log.i("NetworkWorker", "Successfully transmitted SMS webhook for TrxID: $trxId") Result.success() } else { Log.w("NetworkWorker", "Server rejected payload with code: ${response.code}") if (runAttemptCount < 3) Result.retry() else Result.failure() } } catch (e: Exception) { Log.e("NetworkWorker", "Network transmission error: ${e.message}", e) if (runAttemptCount < 3) Result.retry() else Result.failure() } } }