package com.gestoreasy.services

import com.gestoreasy.database.entities.Client
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONObject
import java.util.concurrent.TimeUnit

/**
 * Serviço para busca de dados por CNPJ usando BrasilAPI
 */
class CnpjService {
    private val client = OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .build()
    
    private val baseUrl = "https://brasilapi.com.br/api/cnpj/v1"
    
    suspend fun searchCnpj(cnpj: String): Client? = withContext(Dispatchers.IO) {
        try {
            val cleanCnpj = cnpj.replace(Regex("[^0-9]"), "")
            
            if (cleanCnpj.length != 14) {
                return@withContext null
            }
            
            val request = Request.Builder()
                .url("$baseUrl/$cleanCnpj")
                .get()
                .build()
            
            val response = client.newCall(request).execute()
            
            if (!response.isSuccessful) {
                return@withContext null
            }
            
            val json = JSONObject(response.body?.string() ?: "")
            
            // Mapear dados da API para entidade Client
            val razaoSocial = json.optString("razao_social", "")
            val nomeFantasia = json.optString("nome_fantasia", razaoSocial)
            
            // Endereço
            val enderecoObj = json.optJSONObject("endereco")
            val endereco = buildString {
                enderecoObj?.let {
                    append(it.optString("logradouro", ""))
                    if (it.optString("numero", "").isNotEmpty()) {
                        append(", ${it.optString("numero")}")
                    }
                    if (it.optString("complemento", "").isNotEmpty()) {
                        append(" - ${it.optString("complemento")}")
                    }
                }
            }
            
            val cidade = enderecoObj?.optString("municipio", "")
            val estado = enderecoObj?.optString("uf", "")
            val cep = enderecoObj?.optString("cep", "")?.replace(Regex("[^0-9]"), "")
            
            // Contato
            val telefone = json.optString("ddd_telefone_1", "")
                .takeIf { it.isNotEmpty() }
                ?.let { "($it) ${json.optString("telefone_1", "")}" }
            
            val email = json.optString("email", "")
            
            return@withContext Client(
                id = 0, // Será gerado pelo banco
                nome = nomeFantasia.ifEmpty { razaoSocial },
                tipo = "J",
                cpf_cnpj = cleanCnpj,
                email = email.takeIf { it.isNotEmpty() },
                telefone = telefone,
                endereco = endereco.takeIf { it.isNotEmpty() },
                cidade = cidade,
                estado = estado,
                cep = cep,
                ativo = true
            )
        } catch (e: Exception) {
            e.printStackTrace()
            return@withContext null
        }
    }
}

