<?php
// ============================================================
// function.php  —  PHP 8 compatible database helper library
// Changes from original:
//   - Credentials moved to top constants (unchanged)
//   - All functions now use a shared persistent connection
//     helper to avoid opening a new connection per call
//   - select_row() returns false (not a 404 array) when no
//     row is found, so callers can use a simple if($row) check
//   - delete_row / move_row fixed: original called
//     mysqli_query() twice, second call passed a bool
//   - imageResizeAndThumb: header() moved before any output;
//     imagedestroy() added to free memory
//   - grab_s3_image: CURLOPT_BINARYTRANSFER removed (deprecated
//     PHP 8 — it was a no-op since PHP 5.1.3)
//   - Deprecated: $conn_blog / $conn_properties globals removed
// ============================================================

// ---- Blog DB credentials ----
define('DB_HOST_MSLLCBLOG',     'localhost');
define('DB_USER_MSLLCBLOG',     'aa107user');
define('DB_PASSWORD_MSLLCBLOG', 'alsd897699ekwr0987fasdf');
define('DB_NAME_MSLLCBLOG',     'aa107db');
define('DB_PORT_MSLLCBLOG',     3306);

// ---- Property DB credentials ----
define('DB_HOST_AABONST',     'localhost');
define('DB_USER_AABONST',     'bonstdata3user');
define('DB_PASSWORD_AABONST', 'Lb3@e9#23rhCVnYQ');
define('DB_NAME_AABONST',     'bonstdata3db');
define('DB_PORT_AABONST',     3306);

// ============================================================
// Internal connection helper — returns a shared mysqli object.
// Using a static variable avoids opening a new TCP connection
// on every single database call (was the old behaviour).
// ============================================================
function _get_connection(string $host, string $user, string $pass, string $db, int $port): mysqli
{
    static $pool = [];
    $key = "$host:$port/$db/$user";
    if (!isset($pool[$key]) || !$pool[$key]->ping()) {
        $conn = new mysqli($host, $user, $pass, $db, $port);
        if ($conn->connect_error) {
            // Log rather than die() in production — adjust as needed
            error_log("DB connect error [$key]: " . $conn->connect_error);
            die("Database connection failed. Please try again later.");
        }
        $conn->set_charset('utf8mb4');
        $pool[$key] = $conn;
    }
    return $pool[$key];
}

// Convenience wrappers
function _blog_conn(): mysqli
{
    return _get_connection(DB_HOST_MSLLCBLOG, DB_USER_MSLLCBLOG, DB_PASSWORD_MSLLCBLOG, DB_NAME_MSLLCBLOG, DB_PORT_MSLLCBLOG);
}
function _prop_conn(): mysqli
{
    return _get_connection(DB_HOST_AABONST, DB_USER_AABONST, DB_PASSWORD_AABONST, DB_NAME_AABONST, DB_PORT_AABONST);
}

// ============================================================
// BLOG DB functions
// ============================================================

function insert_row_msllcblog(string $query): int|array
{
    $conn = _blog_conn();
    if (!$conn->query($query)) {
        return ['status' => 404, 'msg' => $conn->error, 'query' => $query];
    }
    $id = $conn->insert_id;
    return ($id > 0) ? $id : ['status' => 404, 'msg' => 'No insert ID', 'query' => $query];
}

function select_row_msllcblog(string $query): array|false
{
    $conn = _blog_conn();
    $result = $conn->query($query);
    if ($result && $result->num_rows > 0) {
        return $result->fetch_assoc();
    }
    return false;
}

function num_rows_msllcblog(string $query): int
{
    $conn = _blog_conn();
    $result = $conn->query($query);
    return $result ? (int)$result->num_rows : 0;
}

function select_array_msllcblog(string $query): array
{
    $conn = _blog_conn();
    $result = $conn->query($query);
    if (!$result || $result->num_rows === 0) {
        return ['status' => 404, 'msg' => $conn->error, 'query' => $query];
    }
    $data = [];
    while ($row = $result->fetch_assoc()) {
        $data[] = $row;
    }
    return $data;
}

function update_row_msllcblog(string $query): int
{
    $conn = _blog_conn();
    return $conn->query($query) ? 1 : 0;
}

function delete_row_msllcblog(string $query): int
{
    $conn = _blog_conn();
    return $conn->query($query) ? 1 : 0;
}

function move_row_msllcblog(string $query): int
{
    $conn = _blog_conn();
    if ($conn->query($query)) {
        return 1;
    }
    error_log("Error moving blog record: " . $conn->error);
    return 0;
}

// ============================================================
// PROPERTY DB functions
// ============================================================

function insert_row(string $query): int|array
{
    $conn = _prop_conn();
    if (!$conn->query($query)) {
        return ['status' => 404, 'msg' => $conn->error, 'query' => $query];
    }
    $id = $conn->insert_id;
    return ($id > 0) ? $id : ['status' => 404, 'msg' => 'No insert ID', 'query' => $query];
}

function select_row(string $query): array|false
{
    $conn = _prop_conn();
    $result = $conn->query($query);
    if ($result && $result->num_rows > 0) {
        return $result->fetch_assoc();
    }
    return false;
}

function num_rows(string $query): int
{
    $conn = _prop_conn();
    $result = $conn->query($query);
    return $result ? (int)$result->num_rows : 0;
}

function select_array(string $query): array
{
    $conn = _prop_conn();
    $result = $conn->query($query);
    if (!$result || $result->num_rows === 0) {
        return ['status' => 404, 'msg' => $conn->error, 'query' => $query];
    }
    $data = [];
    while ($row = $result->fetch_assoc()) {
        $data[] = $row;
    }
    return $data;
}

function update_row(string $query): int
{
    $conn = _prop_conn();
    return $conn->query($query) ? 1 : 0;
}

function delete_row(string $query): int
{
    $conn = _prop_conn();
    return $conn->query($query) ? 1 : 0;
}

function move_row(string $query): int
{
    $conn = _prop_conn();
    if ($conn->query($query)) {
        return 1;
    }
    error_log("Error moving property record: " . $conn->error);
    return 0;
}

// ============================================================
// Utility functions
// ============================================================

function grab_s3_image(string $url, string $saveto): void
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // CURLOPT_BINARYTRANSFER removed — deprecated/no-op in PHP 8
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $raw = curl_exec($ch);
    curl_close($ch);

    if ($raw === false || $raw === '') {
        return;
    }
    if (file_exists($saveto)) {
        unlink($saveto);
    }
    file_put_contents($saveto, $raw);
}

function imageResizeAndThumb(string $filename, string $ls_saveImgPath, string $resize_final_name, string $thumb_final_name): array
{
    // Content-Type must be sent before any output
    header('Content-Type: image/jpeg');

    [$width, $height] = getimagesize($filename);
    $newwidth  = 480;
    $newheight = 320;

    ini_set('memory_limit', '-1');

    $thumb  = imagecreatetruecolor($newwidth, $newheight);
    $source = imagecreatefromjpeg($filename);

    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    imagejpeg($thumb, $ls_saveImgPath . $resize_final_name);
    imagejpeg($thumb, $ls_saveImgPath . $thumb_final_name);

    // Free memory (was missing in original)
    imagedestroy($thumb);
    imagedestroy($source);

    return [
        'resize_image' => $ls_saveImgPath . $resize_final_name,
        'thumb_image'  => $ls_saveImgPath . $thumb_final_name,
    ];
}
