<?php
require_once dirname(__DIR__, 2) . '/config/conexion.php';
require_once dirname(__DIR__, 2) . '/config/db.php';

class ArticuloModel {

    /* ============================================================
       CAMPOS NUMÉRICOS (reutilizados)
       ============================================================ */
    private $camposNumericos = [
        "AR_PrecioVenta1", "AR_PrecioVenta2", "AR_PrecioVenta3",
        "AR_PrecioVenta4", "AR_PrecioVenta5",
        "AR_Peso", "AR_PrecioCostoMN",
        "SA_Saldo_Inicial", "SA_Saldo_Actual", "SA_Saldo_Pendiente_Entrega"
    ];


    /* ============================================================
       NORMALIZAR CONEXIÓN
       ============================================================ */
    private function conectar($ipEncriptada)
    {
        $conn = conectarSeguro($ipEncriptada);

        if (!$conn) {
            return ["error" => "❌ No se pudo conectar a la base de datos."];
        }

        return $conn;
    }


    /* ============================================================
       SQL BASE (REUTILIZADO)
       ============================================================ */
    private function sqlBase()
    {
        return "
            SELECT 
                AR_IdArticulo,
                RTRIM(AR_Descripcion) AS AR_Descripcion,
                RTRIM(AR_Presentacion) AS AR_Presentacion,
                RTRIM(MA_Descripcion) AS MA_Descripcion,
                RTRIM(UN_Descripcion) AS UN_Descripcion,
                RTRIM(UN_Abr) AS UN_Abr,
                AR_PrecioVenta1,
                AR_PrecioVenta2,
                AR_PrecioVenta3,
                AR_PrecioVenta4,
                AR_PrecioVenta5,
                AR_Peso,
                AR_PrecioCostoMN,
                SA_Saldo_Inicial,
                SA_Saldo_Actual,
                SA_Saldo_Pendiente_Entrega
            FROM Articulo
            INNER JOIN Saldo ON SA_IDARTICULO = AR_IdArticulo
            INNER JOIN Marca ON MA_IdMarca = AR_IdMarca
            INNER JOIN Unidad ON UN_IdUnidad = AR_IdUnidad
            WHERE AR_IdEstado = '1'
        ";
    }


    /* ============================================================
       NORMALIZAR UN REGISTRO
       ============================================================ */
    private function normalizarFila($row)
    {
        foreach ($row as $campo => $valor) {

            // Null → 0.00 o vacío
            if ($valor === null) {
                $row[$campo] = in_array($campo, $this->camposNumericos)
                    ? "0.00"
                    : "";
                continue;
            }

            // Trim texto
            if (is_string($valor)) {
                $row[$campo] = trim($valor);
            }

            // Formateo numérico
            if (in_array($campo, $this->camposNumericos)) {
                $row[$campo] = number_format((float)$valor, 2, '.', '');
            }
        }

        return $row;
    }


    /* ============================================================
       NORMALIZAR CRITERIO DE BÚSQUEDA
       ============================================================ */
    private function normalizarCriterio($criterio)
    {
        $criterio = trim((string)$criterio);

        // "leche gloria entera" → "leche%gloria%entera"
        return $criterio ? str_replace(" ", "%", $criterio) : "";
    }


    /* ============================================================
       LISTAR ARTÍCULOS
       ============================================================ */
    public function listarArticulos($criterio, $ipEncriptada)
    {
        $conn = $this->conectar($ipEncriptada);
        if (isset($conn["error"])) return $conn;

        $criterio = $this->normalizarCriterio($criterio);

        $sql = $this->sqlBase() . "
            AND (RTRIM(AR_Descripcion) + RTRIM(AR_Presentacion) LIKE ?)
            ORDER BY AR_IdArticulo, AR_Descripcion
        ";

        $stmt = sqlsrv_query($conn, $sql, ["%$criterio%"]);

        if ($stmt === false) return ["error" => sqlsrv_errors()];

        $data = [];

        while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
            $data[] = $this->normalizarFila($row);
        }

        return $data;
    }


    /* ============================================================
       OBTENER ARTÍCULO POR ID (REUTILIZA TODA LÓGICA)
       ============================================================ */
    public function obtenerArticuloPorId($idArticulo, $ipEncriptada)
    {
        $conn = $this->conectar($ipEncriptada);
        if (isset($conn["error"])) return $conn;

        $idArticulo = trim($idArticulo);

        $sql = $this->sqlBase() . "
            AND AR_IdArticulo = ?
        ";

        $stmt = sqlsrv_query($conn, $sql, [$idArticulo]);

        if ($stmt === false) return ["error" => sqlsrv_errors()];

        $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

        if (!$row) return ["error" => "❌ No encontrado"];

        return $this->normalizarFila($row);
    }
}
