<?php
 session_start();
 function guardar() {
    if (!($_SESSION['usuario_id'] ?? false)) {
        die("⚠️ No autorizado.");
    }

    $conn = getConnection();

    // Capturar campos del formulario
    $clave    = $_POST['clave'];
    $nombre   = $_POST['nombre'];
    $rfc      = $_POST['rfc'];
    $curp     = $_POST['curp'] ?? null;
    $dom      = $_POST['domicilio'];
    $pais     = $_POST['pais'];
    $entidad  = $_POST['entidad'];
    $ciudad   = $_POST['ciudad'];
    $tel      = $_POST['telefono'];
    $caat     = $_POST['caat'];
    $usr_id   = $_SESSION['usuario_id'];

    // INSERT incluyendo id_usuario
    $sql = "INSERT INTO dbo.transportistas
      (clave_identificador, nombre, rfc, curp, domicilio, pais,
       entidad_federativa, ciudad, telefono, caat, id_usuario)
     VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    $params = [
      $clave, $nombre, $rfc, $curp, $dom,
      $pais, $entidad, $ciudad, $tel, $caat,
      $usr_id
    ];

    $stmt = sqlsrv_query($conn, $sql, $params);
    if ($stmt === false) {
        die("❌ Error al guardar transportista: " . print_r(sqlsrv_errors(), true));
    }

    // Redirigir de vuelta a la lista o mostrar mensaje…
    header("Location: /IMPORTADORES/transportistas/lista?success=1");
    exit;
}

require_once __DIR__ . '/../../config/database.php';

function alta() {
    $conn = getConnection();
    // 1) Cargar países
    $sql = "SELECT id_pais, nombre FROM paises ORDER BY nombre";
    $stmt = sqlsrv_query($conn, $sql);
    $paises = [];
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        $paises[] = $row;
    }

    include __DIR__ . '/../../views/transportistas/alta.php';
}

// AJAX: devuelve los estados de un país dado
function estados() {
    header('Content-Type: application/json; charset=utf-8');
    $pais = $_GET['pais'] ?? '';
    $conn = getConnection();
    $sql = "SELECT id_estado, nombre FROM estados WHERE pais_id = ? ORDER BY nombre";
    $stmt = sqlsrv_query($conn, $sql, [$pais]);
    $out = [];
    while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        $out[] = $r;
    }
    echo json_encode($out);
    exit;
}

// AJAX: devuelve las ciudades de un estado dado
function ciudades() {
    header('Content-Type: application/json; charset=utf-8');
    $estado = $_GET['estado'] ?? '';
    $conn = getConnection();
    $sql = "SELECT id_ciudad, nombre FROM ciudades WHERE estado_id = ? ORDER BY nombre";
    $stmt = sqlsrv_query($conn, $sql, [$estado]);
    $out = [];
    while ($r = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        $out[] = $r;
    }
    echo json_encode($out);
    exit;
}

function lista() 
{ 
    include __DIR__ . '/../../views/transportistas/lista.php';
 } 

 /** Descarga la plantilla CSV para carga masiva  **/
function template() {
    $file = __DIR__ . '/../../public/downloads/transportistas_template.csv';
    if (!file_exists($file)) {
        http_response_code(404);
        echo "❌ Plantilla no encontrada.";
        exit;
    }
    header('Content-Type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename="transportistas_template.csv"');
    readfile($file);
    exit;
}

/** Procesa la carga masiva desde un CSV **/
function importar() {
    // 1) Verificar sesión
    if (!($_SESSION['usuario_id'] ?? false)) {
        die("⚠️ No autorizado.");
    }
    $usr_id = $_SESSION['usuario_id'];

    // 2) Validar archivo subido
    if (!isset($_FILES['archivo_csv']) || $_FILES['archivo_csv']['error'] !== UPLOAD_ERR_OK) {
        die("❌ Debes subir un archivo CSV válido.");
    }
    $ext = pathinfo($_FILES['archivo_csv']['name'], PATHINFO_EXTENSION);
    if (strtolower($ext) !== 'csv') {
        die("❌ Solo se permiten archivos .csv");
    }

    // 3) Abrir y leer CSV
    $fh = fopen($_FILES['archivo_csv']['tmp_name'], 'r');
    if (!$fh) {
        die("❌ No se pudo abrir el archivo.");
    }

    // 4) Encabezados esperados
    $header   = fgetcsv($fh, 1000, ',');
    $expected = [
      'clave_identificador','nombre','rfc','curp',
      'telefono','caat','pais_id','estado_id',
      'ciudad_id','domicilio'
    ];
    if ($header === false || array_map('trim', $header) !== $expected) {
        fclose($fh);
        die("❌ Encabezado de CSV inválido. Debe contener: " . implode(',', $expected));
    }

    $conn   = getConnection();
    $errors = [];
    $rowNum = 1;

    while (($row = fgetcsv($fh, 2000, ',')) !== false) {
        $rowNum++;
        // asegurarse de tener todas las columnas
        if (count($row) < count($expected)) {
            $errors[] = "Fila $rowNum: faltan columnas.";
            continue;
        }
        // mapear valores y trim
        list($clave,$nombre,$rfc,$curp,$tel,$caat,$pais_id,$estado_id,$ciudad_id,$dom) = array_map('trim', $row);

        // validar obligatorios
        if ($clave==='' || $nombre==='' || $rfc==='' || $tel==='' || $caat==='' 
            || $pais_id==='' || $estado_id==='' || $ciudad_id==='' || $dom==='') {
            $errors[] = "Fila $rowNum: faltan datos obligatorios.";
            continue;
        }

        // Convertir IDs a nombres
        $pais_nombre = '';
        $estado_nombre = '';
        $ciudad_nombre = '';

        // Consultar nombre del país
        $sql = "SELECT nombre FROM dbo.paises WHERE id_pais = ?";
        $stmt = sqlsrv_query($conn, $sql, [$pais_id]);
        if ($row_pais = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            $pais_nombre = $row_pais['nombre'];
        } else {
            $errors[] = "Fila $rowNum: país con ID $pais_id no encontrado.";
            continue;
        }

        // Consultar nombre del estado
        $sql = "SELECT nombre FROM dbo.estados WHERE id_estado = ?";
        $stmt = sqlsrv_query($conn, $sql, [$estado_id]);
        if ($row_estado = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            $estado_nombre = $row_estado['nombre'];
        } else {
            $errors[] = "Fila $rowNum: estado con ID $estado_id no encontrado.";
            continue;
        }

        // Consultar nombre de la ciudad
        $sql = "SELECT nombre FROM dbo.ciudades WHERE id_ciudad = ?";
        $stmt = sqlsrv_query($conn, $sql, [$ciudad_id]);
        if ($row_ciudad = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            $ciudad_nombre = $row_ciudad['nombre'];
        } else {
            $errors[] = "Fila $rowNum: ciudad con ID $ciudad_id no encontrada.";
            continue;
        }

        // 5) Insertar en BD con nombres
        $sql  = "INSERT INTO dbo.transportistas
          (clave_identificador, nombre, rfc, curp, telefono, caat,
           pais, entidad_federativa, ciudad, domicilio, id_usuario)
         VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        $params = [
            $clave, $nombre, $rfc, $curp, $tel,
            $caat, $pais_nombre, $estado_nombre, $ciudad_nombre, $dom,
            $usr_id
        ];
        $stmt = sqlsrv_query($conn, $sql, $params);
        if ($stmt === false) {
            $errors[] = "Fila $rowNum: error al guardar → " . print_r(sqlsrv_errors(), true);
        }
    }
    fclose($fh);

    // 6) Redirigir con resultado
    if (count($errors) > 0) {
        $_SESSION['import_errors'] = $errors;
        header('Location: /IMPORTADORES/transportistas/bulk_upload?status=error');
    } else {
        $_SESSION['import_success'] = true;
        header('Location: /IMPORTADORES/transportistas/bulk_upload?status=ok');
    }
    exit;
}

function bulk_upload() {
    
    include __DIR__ . '/../../views/transportistas/bulk_upload.php';
}

function ajax_lista() {
    // 1) Autorización
    if (!($_SESSION['usuario_id'] ?? false)) {
        http_response_code(403);
        echo json_encode([]);
        exit;
    }
    $usr = $_SESSION['usuario_id'];

    $conn = getConnection();

    // 2) Parámetros de DataTables
    $draw   = intval($_GET['draw']   ?? 0);
    $start  = intval($_GET['start']  ?? 0);
    $length = intval($_GET['length'] ?? 10);
    $search = $_GET['search']['value'] ?? '';

    // Mapeo columnas - ahora incluimos el nombre de la ciudad
    $cols = ['t.id_transportista','t.clave_identificador','t.nombre','t.rfc','c.nombre','t.creado_en'];
    $orderColIdx = intval($_GET['order'][0]['column'] ?? 5);
    $orderDir    = strtoupper($_GET['order'][0]['dir'] ?? 'ASC') === 'DESC' ? 'DESC' : 'ASC';
    $orderCol    = in_array($orderColIdx, range(0,5)) ? $cols[$orderColIdx] : 't.creado_en';

    // 3) Total registros sin filtro
    $sqlTotal = "SELECT COUNT(*) AS total FROM dbo.transportistas WHERE id_usuario = ? AND activo = 1";
    $stmt     = sqlsrv_query($conn, $sqlTotal, [$usr]);
    $row      = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    $recordsTotal = (int)$row['total'];

    // 4) Construir condiciones de filtro
    $where = "t.id_usuario = ? AND t.activo = 1 ";
    $params = [$usr];
    
    if ($search !== '') {
        // Ahora buscamos en campos de transportista Y en el nombre de la ciudad
        $where .= " AND (
            t.clave_identificador LIKE ? OR 
            t.nombre LIKE ? OR 
            t.rfc LIKE ? OR 
            t.curp LIKE ? OR
            t.telefono LIKE ? OR
            t.caat LIKE ? OR
            c.nombre LIKE ? OR
            p.nombre LIKE ? OR
            e.nombre LIKE ?
        )";
        $like = "%{$search}%";
        // Agregamos el parámetro para cada campo de búsqueda
        $params = array_merge($params, array_fill(0, 9, $like));
    }

    // 5) Total registros filtrados (CON JOIN)
    $sqlFiltered = "
        SELECT COUNT(*) AS total 
        FROM dbo.transportistas t
        LEFT JOIN dbo.ciudades c ON t.ciudad = c.id_ciudad
        LEFT JOIN dbo.estados e ON c.estado_id = e.id_estado  
        LEFT JOIN dbo.paises p ON e.pais_id = p.id_pais
        WHERE $where
    ";
    $stmtF = sqlsrv_query($conn, $sqlFiltered, $params);
    $rowF  = sqlsrv_fetch_array($stmtF, SQLSRV_FETCH_ASSOC);
    $recordsFiltered = (int)$rowF['total'];

    // 6) Datos de la página con JOIN completo
    $sqlData = "
      SELECT t.id_transportista, 
             t.clave_identificador, 
             t.nombre, 
             t.rfc, 
             COALESCE(c.nombre, 'Ciudad no encontrada') as ciudad_nombre,
             COALESCE(e.nombre, '') as estado_nombre,
             COALESCE(p.nombre, '') as pais_nombre,
             t.creado_en
      FROM dbo.transportistas t
      LEFT JOIN dbo.ciudades c ON t.ciudad = c.id_ciudad
      LEFT JOIN dbo.estados e ON c.estado_id = e.id_estado  
      LEFT JOIN dbo.paises p ON e.pais_id = p.id_pais
      WHERE $where
      ORDER BY $orderCol $orderDir
      OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
    ";
    // agregar offset/limit al final
    $params[] = $start;
    $params[] = $length;
    $stmtD = sqlsrv_query($conn, $sqlData, $params);

    $data = [];
    while ($r = sqlsrv_fetch_array($stmtD, SQLSRV_FETCH_ASSOC)) {
        $data[] = [
            $r['id_transportista'],
            $r['clave_identificador'],
            $r['nombre'],
            $r['rfc'],
            $r['ciudad_nombre'], // Ahora muestra el nombre real de la ciudad
            $r['creado_en'] instanceof DateTime
              ? $r['creado_en']->format('Y-m-d H:i')
              : ''
        ];
    }

    // 7) Devolver JSON
    header('Content-Type: application/json; charset=UTF-8');
    echo json_encode([
      "draw"            => $draw,
      "recordsTotal"    => $recordsTotal,
      "recordsFiltered" => $recordsFiltered,
      "data"            => $data
    ]);
    exit;
}

function editar() {
    // 1) Verificar sesión
    if (!($_SESSION['usuario_id'] ?? false)) {
        header('Location: /IMPORTADORES/login');
        exit;
    }
    $usr = $_SESSION['usuario_id'];

    // 2) Obtener el ID y validarlo
    $id = $_GET['id'] ?? null;
    if (!$id || !is_numeric($id)) {
        die("❌ ID de transportista inválido.");
    }

    $conn = getConnection();

    // 3) Consultar el transportista (pertenece al usuario)
    $sql = "SELECT * FROM dbo.transportistas
            WHERE id_transportista = ? AND id_usuario = ?";
    $stmt = sqlsrv_query($conn, $sql, [$id, $usr]);
    $t = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
    if (!$t) {
        die("❌ Transportista no encontrado o no autorizado.");
    }

    // 4) Cargar listas de países, estados y ciudades
    // --- Países ---
    $paises = [];
    $rs = sqlsrv_query($conn, "SELECT id_pais, nombre FROM dbo.paises ORDER BY nombre");
    while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
        $paises[] = $r;
    }

    // --- Estados para el país actual ---
    $estados = [];
    $rs = sqlsrv_query($conn, "SELECT id_estado, nombre FROM dbo.estados WHERE pais_id = ? ORDER BY nombre", [$t['pais']]);
    while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
        $estados[] = $r;
    }

    // --- Ciudades para el estado actual ---
    $ciudades = [];
    $rs = sqlsrv_query($conn, "SELECT id_ciudad, nombre FROM dbo.ciudades WHERE estado_id = ? ORDER BY nombre", [$t['entidad_federativa']]);
    while ($r = sqlsrv_fetch_array($rs, SQLSRV_FETCH_ASSOC)) {
        $ciudades[] = $r;
    }

    // 5) Renderizar la vista
    include __DIR__ . '/../../views/transportistas/editar.php';
}

/** Procesa el POST de actualización **/
function actualizar() {
    session_start();
    if (!($_SESSION['usuario_id'] ?? false)) {
        die("⚠️ No autorizado.");
    }
    $usr = $_SESSION['usuario_id'];

    // 1) Capturar y validar datos
    $id    = $_POST['id_transportista'] ?? null;
    $clave = trim($_POST['clave'] ?? '');
    $nombre= trim($_POST['nombre'] ?? '');
    $rfc   = trim($_POST['rfc'] ?? '');
    $curp  = trim($_POST['curp'] ?? '');
    $tel   = trim($_POST['telefono'] ?? '');
    $caat  = trim($_POST['caat'] ?? '');
    $pais  = $_POST['pais'] ?? '';
    $estado= $_POST['entidad'] ?? '';
    $ciudad= $_POST['ciudad'] ?? '';
    $dom   = trim($_POST['domicilio'] ?? '');

    if (!$id || !is_numeric($id)
        || $clave===''||$nombre===''||$rfc===''||$tel===''||$caat===''
        || $pais===''||$estado===''||$ciudad===''||$dom===''
    ) {
        die("❌ Faltan datos obligatorios.");
    }

    $conn = getConnection();

    // 2) Verificar que exista y pertenezca al usuario
    $sqlChk = "SELECT COUNT(*) AS cnt
               FROM dbo.transportistas
               WHERE id_transportista = ? AND id_usuario = ?";
    $stmtChk = sqlsrv_query($conn, $sqlChk, [$id, $usr]);
    $rowChk = sqlsrv_fetch_array($stmtChk, SQLSRV_FETCH_ASSOC);
    if ($rowChk['cnt'] == 0) {
        die("❌ Transportista no encontrado o no autorizado.");
    }

    // 3) Ejecutar UPDATE
    $sqlUpd = "UPDATE dbo.transportistas SET
                  clave_identificador = ?,
                  nombre               = ?,
                  rfc                  = ?,
                  curp                 = ?,
                  telefono             = ?,
                  caat                 = ?,
                  pais                 = ?,
                  entidad_federativa   = ?,
                  ciudad               = ?,
                  domicilio            = ?
               WHERE id_transportista = ?";
    $params = [
        $clave, $nombre, $rfc, $curp, $tel,
        $caat, $pais, $estado, $ciudad, $dom,
        $id
    ];
    $stmtUpd = sqlsrv_query($conn, $sqlUpd, $params);
    if ($stmtUpd === false) {
        die("❌ Error al actualizar: " . print_r(sqlsrv_errors(), true));
    }

    // 4) Redirigir con éxito
    header("Location: /IMPORTADORES/transportistas/lista?edit=ok");
    exit;
}

function eliminar() {
    session_start();
    if (!($_SESSION['usuario_id'] ?? false)) {
        header('Location: /IMPORTADORES/login');
        exit;
    }
    $usr = $_SESSION['usuario_id'];
    $id  = $_GET['id'] ?? null;
    if (!$id || !is_numeric($id)) {
        die("❌ ID inválido.");
    }

    $conn = getConnection();

    // Verificar que el transportista exista y pertenezca al usuario
    $sqlChk = "SELECT COUNT(*) AS cnt
               FROM dbo.transportistas
               WHERE id_transportista = ? AND id_usuario = ?";
    $stmtChk = sqlsrv_query($conn, $sqlChk, [$id, $usr]);
    $rowChk  = sqlsrv_fetch_array($stmtChk, SQLSRV_FETCH_ASSOC);
    if ($rowChk['cnt'] == 0) {
        die("❌ Transportista no encontrado o no autorizado.");
    }

    // ELIMINACIÓN REAL - DELETE en lugar de UPDATE
    $sqlDel = "DELETE FROM dbo.transportistas WHERE id_transportista = ?";
    $stmtDel = sqlsrv_query($conn, $sqlDel, [$id]);
    if ($stmtDel === false) {
        die("❌ Error al eliminar: " . print_r(sqlsrv_errors(), true));
    }

    // Redirigir con parámetro para SweetAlert
    header("Location: /IMPORTADORES/transportistas/lista?deleted=ok");
    exit;
}