package com.example.compose3

import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Column
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.rememberScrollState
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
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 org.json.JSONObject

// --------------------------------------------------------------------------------
// 1. DATA CLASS (MODELO)
// --------------------------------------------------------------------------------

data class Estudiante(
    // El ID se usa para la inserción (enviamos 0) y para la búsqueda, aunque aquí solo insertamos.
    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
)

// --------------------------------------------------------------------------------
// 2. FUNCIÓN DE RED (INSERCIÓN)
// --------------------------------------------------------------------------------

fun insertarEstudiante(
    estudiante: Estudiante,
    context: Context,
    onSuccess: (String) -> Unit,
    onError: (String) -> Unit
) {

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

    // Crear el objeto JSON con todos los datos del estudiante
    val jsonBody = JSONObject().apply {
        put("id", estudiante.id)
        put("tipo_documento", estudiante.tipo_documento)
        put("numero_documento", estudiante.numero_documento)
        put("apellido_paterno", estudiante.apellido_paterno)
        put("apellido_materno", estudiante.apellido_materno)
        put("nombres", estudiante.nombres)
        put("fecha_nacimiento", estudiante.fecha_nacimiento)
        put("correo_electronico", estudiante.correo_electronico)
    }

    val request = JsonObjectRequest(
        Request.Method.POST,
        url,
        jsonBody,
        { response ->
            try {
                if (response.has("success") && response.getBoolean("success")) {
                    val mensaje = response.optString("mensaje", "Inserción exitosa.")
                    onSuccess(mensaje) // Éxito
                } else {
                    val mensaje = response.optString("mensaje", "Error desconocido en la inserción.")
                    onError(mensaje) // Error del servidor
                }
            } catch (e: Exception) {
                onError("Error al procesar la respuesta: ${e.localizedMessage}")
            }
        },
        { error ->
            onError("Error de conexión: ${error.message ?: "Error desconocido"}")
        }
    )
    queue.add(request)
}

// --------------------------------------------------------------------------------
// 3. PANTALLA COMPOSABLE (VISTA DE INSERCIÓN)
// --------------------------------------------------------------------------------

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun InsertarEstudianteScreen() {
    // Variables de estado para los inputs (todos son editables)
    var tipoDocumento by remember { mutableStateOf("DNI") }
    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("AAAA-MM-DD") }
    var correoElectronico by remember { mutableStateOf("") }

    var isLoading by remember { mutableStateOf(false) }
    var resultMessage by remember { mutableStateOf("") }
    var isSuccess by remember { mutableStateOf(false) }
    val context = LocalContext.current

    val limpiarCampos = {
        numeroDocumento = ""
        apellidoPaterno = ""
        apellidoMaterno = ""
        nombres = ""
        correoElectronico = ""
        fechaNacimiento = "AAAA-MM-DD"
    }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(16.dp)
            .verticalScroll(rememberScrollState()), // Permite el desplazamiento si hay muchos campos
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(
            text = "Insertar Nuevo Estudiante",
            style = MaterialTheme.typography.headlineMedium,
            modifier = Modifier.padding(bottom = 16.dp)
        )

        // Campos de entrada (Editables)
        OutlinedTextField(value = apellidoPaterno, onValueChange = { apellidoPaterno = it }, label = { Text("Apellido Paterno (Obligatorio)") }, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = apellidoMaterno, onValueChange = { apellidoMaterno = it }, label = { Text("Apellido Materno") }, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = nombres, onValueChange = { nombres = it }, label = { Text("Nombres") }, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))

        OutlinedTextField(value = tipoDocumento, onValueChange = { tipoDocumento = it }, label = { Text("Tipo de Documento (Ej: DNI)") }, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(
            value = numeroDocumento,
            onValueChange = { numeroDocumento = it.filter { c -> c.isDigit() } },
            label = { Text("Número de Documento (Obligatorio)") },
            keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
            modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp)
        )

        OutlinedTextField(value = correoElectronico, onValueChange = { correoElectronico = it }, label = { Text("Correo Electrónico") }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))
        OutlinedTextField(value = fechaNacimiento, onValueChange = { fechaNacimiento = it }, label = { Text("Fecha de Nacimiento (AAAA-MM-DD)") }, modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp))

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

        // Botón de Inserción
        Button(
            onClick = {
                // Validación básica antes de enviar
                if (numeroDocumento.isNotEmpty() && apellidoPaterno.isNotEmpty()) {
                    isLoading = true
                    resultMessage = ""

                    val nuevoEstudiante = Estudiante(
                        id = 0, // ID de placeholder
                        tipo_documento = tipoDocumento,
                        numero_documento = numeroDocumento,
                        apellido_paterno = apellidoPaterno,
                        apellido_materno = apellidoMaterno,
                        nombres = nombres,
                        fecha_nacimiento = fechaNacimiento,
                        correo_electronico = correoElectronico
                    )

                    insertarEstudiante(nuevoEstudiante, context,
                        onSuccess = { message ->
                            resultMessage = message
                            isSuccess = true
                            limpiarCampos()
                            isLoading = false
                        },
                        onError = { error ->
                            resultMessage = error
                            isSuccess = false
                            isLoading = false
                        }
                    )
                } else {
                    resultMessage = "Los campos DNI y Apellido Paterno son obligatorios."
                    isSuccess = false
                }
            },
            modifier = Modifier.fillMaxWidth().padding(vertical = 16.dp)
        ) {
            if (isLoading) { CircularProgressIndicator(color = Color.White, modifier = Modifier.size(24.dp)) } else { Text("Insertar Estudiante") }
        }

        // Mensaje de resultado (Éxito/Error)
        if (resultMessage.isNotEmpty()) {
            Text(
                text = resultMessage,
                color = if (isSuccess) Color(0xFF4CAF50) else MaterialTheme.colorScheme.error,
                modifier = Modifier.padding(8.dp)
            )
        }
        Spacer(modifier = Modifier.height(30.dp))
    }
}

// --------------------------------------------------------------------------------
// 4. MAIN ACTIVITY Y PREVIEW
// --------------------------------------------------------------------------------

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            // ⚠️ Ajusta este paquete de tema si es necesario
            com.example.compose3.ui.theme.Compose3Theme {
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
                    // Solo mostramos la pantalla de Inserción.
                    InsertarEstudianteScreen()
                }
            }
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    com.example.compose3.ui.theme.Compose3Theme {
        InsertarEstudianteScreen()
    }
}