package com.example.compose001

import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.input.KeyboardType
import com.android.volley.Request
import org.json.JSONObject
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley

// Insertar Base de datos remota un nuevo artículo
// Aplicación para agregar artículos a base de datos

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            InsertarArticulo()
        }
    }
}

@Composable
fun InsertarArticulo() {
    val contexto = LocalContext.current
    var descripcion by remember { mutableStateOf("") }
    var precio by remember { mutableStateOf("") }
    var categoria by remember { mutableStateOf("") }
    var mensaje by remember { mutableStateOf("") }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
    ) {
        OutlinedTextField(
            value = descripcion,
            onValueChange = { descripcion = it },
            label = {
                Text("Descripción")
            },
            modifier = Modifier
                .fillMaxWidth()
                .padding(10.dp),
            singleLine = true
        )
        OutlinedTextField(
            value = precio,
            onValueChange = { precio = it },
            label = {
                Text("Precio")
            },
            modifier = Modifier
                .fillMaxWidth()
                .padding(10.dp),
            singleLine = true,
            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
        )
        OutlinedTextField(
            value = categoria,
            onValueChange = { categoria = it },
            label = {
                Text("Categoria")
            },
            modifier = Modifier
                .fillMaxWidth()
                .padding(10.dp),
            singleLine = true
        )

        Button(
            onClick = {
                // Validar que los campos no estén vacíos
                if (descripcion.isNotBlank() && precio.isNotBlank() && categoria.isNotBlank()) {
                    AltaArticulo(
                        descripcion = descripcion,
                        precio = precio,
                        categoria = categoria,
                        contexto = contexto,
                        respuesta = { exitoso ->
                            if (exitoso) {
                                mensaje = "Se cargaron los datos correctamente"
                                // Limpiar todos los campos
                                descripcion = ""
                                precio = ""
                                categoria = ""
                            } else {
                                mensaje = "Problemas en la carga"
                            }
                        }
                    )
                } else {
                    mensaje = "Por favor complete todos los campos"
                }
            },
            modifier = Modifier.padding(10.dp)
        ) {
            Text(text = "Agregar")
        }

        if (mensaje.isNotEmpty()) {
            Text(
                text = mensaje,
                modifier = Modifier.padding(10.dp)
            )
        }
    }
}


fun AltaArticulo(descripcion: String, precio: String, categoria: String, contexto: Context, respuesta: (Boolean) -> Unit) {
    try {
        val requestQueue = Volley.newRequestQueue(contexto)
        val url = "http://nazario.tknegocios.com/consultas/insertar_articulo.php"

        val parametros = JSONObject()
        parametros.put("descripcion", descripcion)
        parametros.put("precio", precio)
        parametros.put("categoria", categoria)

        Log.d("AltaArticulo", "Enviando datos: $parametros")

        val requerimiento = object : JsonObjectRequest(
            Request.Method.POST,
            url,
            parametros,
            { response ->
                Log.d("AltaArticulo", "Respuesta recibida: $response")
                try {
                    // Verificar diferentes formatos de respuesta
                    val resultado = response.optString("respuesta", "")
                    val success = response.optBoolean("success", false)
                    val status = response.optString("status", "")

                    // Aceptar cualquiera de estos formatos como éxito
                    if (resultado.equals("ok", ignoreCase = true) ||
                        success ||
                        status.equals("ok", ignoreCase = true) ||
                        status.equals("success", ignoreCase = true)) {
                        respuesta(true)
                    } else {
                        Log.d("AltaArticulo", "Respuesta no reconocida como exitosa")
                        respuesta(false)
                    }
                } catch (e: Exception) {
                    Log.e("AltaArticulo", "Error al procesar respuesta: ${e.message}")
                    respuesta(false)
                }
            },
            { error ->
                Log.e("AltaArticulo", "Error en la petición: ${error.message}")
                error.networkResponse?.let {
                    Log.e("AltaArticulo", "Código de error: ${it.statusCode}")
                    val responseBody = String(it.data)
                    Log.e("AltaArticulo", "Datos: $responseBody")

                    // Si el código de respuesta es 200, considerar como éxito
                    // aunque Volley lo trate como error (puede ser un JSON mal formado)
                    if (it.statusCode == 200) {
                        Log.d("AltaArticulo", "Código 200 - considerando como éxito")
                        respuesta(true)
                        return@let
                    }
                }
                respuesta(false)
            }
        ) {
            override fun getBodyContentType(): String {
                return "application/json; charset=utf-8"
            }
        }

        requestQueue.add(requerimiento)
    } catch (e: Exception) {
        Log.e("AltaArticulo", "Error general: ${e.message}")
        respuesta(false)
    }
}
