package com.example.compose002 // ⚠️ AJUSTA TU PAQUETE

import android.content.Context
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.android.volley.Request
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.example.compose002.ui.theme.Compose002Theme
import org.json.JSONObject

// --------------------------------------------------------------------------------
// DATA CLASS
// --------------------------------------------------------------------------------

data class Estudiante(
    val id: Int,
    val tipo_documento: String,
    val numero_documento: String,
    val apellido_paterno: String,
    val apellido_materno: String,
    val nombres: String,
    val fecha_nacimiento: String,
    val correo_electronico: String
)

// --------------------------------------------------------------------------------
// FUNCIÓN DE BÚSQUEDA (Utiliza Volley)
// --------------------------------------------------------------------------------

fun buscarEstudiantePorDNI(
    dni: String,
    context: Context,
    onSuccess: (Estudiante) -> Unit,
    onError: (String) -> Unit
) {

    val url = "http://nazario.tknegocios.com/consultas/consultar_estudiante1.php"
    val queue = Volley.newRequestQueue(context)


    val jsonBody = JSONObject().apply {
        put("dni", dni)
    }

    val request = JsonObjectRequest(
        Request.Method.POST,
        url,
        jsonBody,
        { response ->
            try {
                Log.d("API_Response", response.toString())

                if (response.has("success") && response.getBoolean("success")) {
                    // Obtener el objeto 'datos' que tu PHP devuelve
                    val datos = response.getJSONObject("datos")

                    val estudiante = Estudiante(
                        id = datos.getInt("id"),
                        tipo_documento = datos.getString("tipo_documento"),
                        numero_documento = datos.getString("numero_documento"),
                        apellido_paterno = datos.getString("apellido_paterno"),
                        apellido_materno = datos.getString("apellido_materno"),
                        nombres = datos.getString("nombres"),
                        fecha_nacimiento = datos.getString("fecha_nacimiento"),
                        correo_electronico = datos.getString("correo_electronico")
                    )

                    onSuccess(estudiante)

                } else {
                    // Si el servidor responde con "success: false" (DNI no encontrado)
                    val mensaje = response.optString("mensaje", "No se encontró el estudiante.")
                    onError(mensaje) // Llama a error y limpia campos
                }
            } catch (e: Exception) {
                Log.e("buscarEstudiante", "Error parseando JSON o obteniendo campos", e)
                onError("Error al procesar los datos: ${e.localizedMessage}")
            }
        },
        { error ->
            val errorMessage = when {
                error.networkResponse?.statusCode == 404 -> "Servicio no encontrado. Verifica la URL."
                error.networkResponse?.statusCode == 500 -> "Error interno del servidor."
                else -> "Error de conexión: ${error.message ?: "Error desconocido"}"
            }
            onError(errorMessage)
        }
    )

    queue.add(request)
}

// --------------------------------------------------------------------------------
// UI PRINCIPAL - PANTALLA DE BÚSQUEDA
// --------------------------------------------------------------------------------

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BuscarPorDNIScreen() {
    // Variables de entrada y estado de la consulta
    var dni by remember { mutableStateOf("") }
    var isLoading by remember { mutableStateOf(false) }
    var errorMessage by remember { mutableStateOf("") }
    val context = LocalContext.current

    // Variables de estado para mostrar los datos del estudiante
    var tipoDocumento by remember { mutableStateOf("") }
    var numeroDocumento by remember { mutableStateOf("") }
    var apellidoPaterno by remember { mutableStateOf("") }
    var apellidoMaterno by remember { mutableStateOf("") }
    var nombres by remember { mutableStateOf("") }
    var fechaNacimiento by remember { mutableStateOf("") }
    var correoElectronico by remember { mutableStateOf("") }
    var encontrado by remember { mutableStateOf(false) }

    // Función para limpiar los campos de resultado
    val limpiarCampos = {
        tipoDocumento = ""
        numeroDocumento = ""
        apellidoPaterno = ""
        apellidoMaterno = ""
        nombres = ""
        fechaNacimiento = ""
        correoElectronico = ""
        encontrado = false
    }


    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        // Título o encabezado
        Text(
            text = "Búsqueda por DNI",
            style = MaterialTheme.typography.headlineMedium,
            modifier = Modifier.padding(bottom = 16.dp)
        )

        // Campo de entrada DNI
        OutlinedTextField(
            value = dni,
            onValueChange = { dni = it.filter { c -> c.isDigit() } },
            label = { Text("Ingrese DNI a buscar") },
            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
            modifier = Modifier.fillMaxWidth()
        )

        Button(
            onClick = {
                if (dni.isNotEmpty()) {
                    isLoading = true
                    errorMessage = ""
                    limpiarCampos()

                    buscarEstudiantePorDNI(dni, context,
                        onSuccess = { result ->
                            // 🎯 ASIGNACIÓN DE DATOS
                            tipoDocumento = result.tipo_documento
                            numeroDocumento = result.numero_documento
                            apellidoPaterno = result.apellido_paterno
                            apellidoMaterno = result.apellido_materno
                            nombres = result.nombres
                            fechaNacimiento = result.fecha_nacimiento
                            correoElectronico = result.correo_electronico
                            encontrado = true

                            errorMessage = "Estudiante encontrado"
                            isLoading = false
                        },
                        onError = { error ->
                            errorMessage = error
                            limpiarCampos()
                            isLoading = false
                        }
                    )
                } else {
                    errorMessage = "Por favor, ingrese un DNI"
                }
            },
            modifier = Modifier
                .fillMaxWidth()
                .padding(vertical = 16.dp)
        ) {
            if (isLoading) {
                CircularProgressIndicator(color = Color.White, modifier = Modifier.size(24.dp))
            } else {
                Text("Buscar por DNI")
            }
        }

        Spacer(modifier = Modifier.height(16.dp))

        // --------------------------------------------------------------------------------
        // CAMPOS DE RESULTADO
        // --------------------------------------------------------------------------------

        OutlinedTextField(value = apellidoPaterno, onValueChange = { /* Solo lectura */ }, label = { Text("Apellido Paterno") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = apellidoMaterno, onValueChange = { /* Solo lectura */ }, label = { Text("Apellido Materno") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = nombres, onValueChange = { /* Solo lectura */ }, label = { Text("Nombres") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = tipoDocumento, onValueChange = { /* Solo lectura */ }, label = { Text("Tipo de Documento") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = numeroDocumento, onValueChange = { /* Solo lectura */ }, label = { Text("Número de Documento") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = correoElectronico, onValueChange = { /* Solo lectura */ }, label = { Text("Correo Electrónico") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = fechaNacimiento, onValueChange = { /* Solo lectura */ }, label = { Text("Fecha de Nacimiento") }, readOnly = true, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))

        Spacer(modifier = Modifier.height(16.dp))

        // Indicador de Estudiante encontrado (Checkbox y Mensaje)
        Row(
            verticalAlignment = Alignment.CenterVertically
        ) {
            Checkbox(
                checked = encontrado,
                onCheckedChange = { /* No permitir cambiar */ },
                enabled = encontrado
            )
            Text(
                text = if (encontrado) "Estudiante encontrado" else errorMessage,
                color = if (encontrado) Color(0xFF4CAF50) else MaterialTheme.colorScheme.error,
                modifier = Modifier.padding(8.dp)
            )
        }
    }
}

// --------------------------------------------------------------------------------
// MAIN ACTIVITY Y PREVIEW
// --------------------------------------------------------------------------------

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            Compose002Theme {
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    BuscarPorDNIScreen()
                }
            }
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    Compose002Theme {
        BuscarPorDNIScreen()
    }
}