<?php
class Apartado
{
    public $idModulo;
    public $id;
    public $icono;
    public $titulo;
    public $tipo;
    public $nombreArchivo;
    public $descripcion;
    public $nivel;
    public $superior = 0;
    public $mantenimiento;
    public $subApartados = [];
    public $fechaRegistro;

    function __construct()
    {
        !empty($this->fechaRegistro) && $this->fechaRegistro = date("d-m-Y h:i a", strtotime($this->fechaRegistro));
        !empty($this->nivel) && $this->nivel = intval($this->nivel);

        if (!empty($this->id) && $this->nivel < 4) {
            $nivel = $this->nivel + 1;
            $subApartados = Apartado::obtenerPorSuperior($this->id, $nivel);
            $this->subApartados = $subApartados->status == 200 ? $subApartados->data : [];
        }
    }

    public static function obtenerTodos()
    {
        $db = obtenerConexion();
    }

    public static function obtenerPorModulo($modulo): object
    {
        $db = obtenerConexion();

        $query = "SELECT * FROM sistema.view_apartados WHERE modulo = :modulo AND estado = 1 AND nivel = 1 ORDER BY titulo ASC";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':modulo', $modulo, PDO::PARAM_INT);

        try {
            $stmt->execute();

            $datos = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)[
                'status' => 200,
                'message' => 'success',
                'data' => $datos
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerPorSuperior($superior, $nivel)
    {
        $db = obtenerConexion();

        $query = "SELECT * FROM sistema.view_apartados WHERE superior = :superior AND nivel = :nivel AND estado = 1 ORDER BY titulo ASC";

        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':superior', $superior, PDO::PARAM_INT);
        $stmt->bindParam(':nivel', $nivel, PDO::PARAM_INT);

        try {
            $stmt->execute();

            $datos = $stmt->fetchAll(PDO::FETCH_CLASS, __CLASS__);

            return (object)[
                'status' => 200,
                'message' => 'success',
                'data' => $datos
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public function guardar($db = null, $usuario): object
    {
        if (empty($db)) $db = obtenerConexion();

        $respuesta = null;
        $id = null;

        $query = "EXEC sistema.sp_guardarApartado :modulo,:id,:icono,:titulo,:descripcion,:tipo,:nombreArchivo,:superior,:nivel,:mantenimiento,:usuario,:respuesta,:idApartado;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':modulo', $this->idModulo, PDO::PARAM_INT);
        $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);
        $stmt->bindParam(':icono', $this->icono, PDO::PARAM_STR);
        $stmt->bindParam(':titulo', $this->titulo, PDO::PARAM_STR);
        $stmt->bindParam(':descripcion', $this->descripcion, PDO::PARAM_STR);
        $stmt->bindParam(':tipo', $this->tipo, PDO::PARAM_STR);
        $stmt->bindParam(':nombreArchivo', $this->nombreArchivo, PDO::PARAM_STR);
        $stmt->bindParam(':superior', $this->superior, PDO::PARAM_INT);
        $stmt->bindParam(':nivel', $this->nivel, PDO::PARAM_INT);
        $stmt->bindParam(':mantenimiento', $this->mantenimiento, PDO::PARAM_INT);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 4000);
        $stmt->bindParam(':idApartado', $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 100);

        try {
            $stmt->execute();

            $this->id = $id;

            return (object)[
                'status' => 200,
                'message' => $respuesta,
                'id' => $this->id
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function limpiarPorModulo($db, $idModulo, $arrApartados = []): object
    {
        $strApartados = count($arrApartados) > 0 ? implode(",", $arrApartados) : "0";

        $respuesta = null;

        $query = "EXEC sistema.sp_limpiarApartadosModulo :idModulo,:apartados,:respuesta;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':idModulo', $idModulo, PDO::PARAM_INT);
        $stmt->bindParam(':apartados', $strApartados, PDO::PARAM_STR);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 4000);

        try {
            $stmt->execute();

            return (object)[
                'status' => 200,
                'message' => $respuesta
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }

    public static function obtenerPorArchivoModulo($nombreArchivo, $contenedor): object
    {
        try {
            $db = obtenerConexion();
            $query = "SELECT top(1) * FROM sistema.view_apartados WHERE estado = 1 AND nombreArchivo = :nombreArchivo AND contenedor = :contenedor;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(':nombreArchivo', $nombreArchivo, PDO::PARAM_STR);
            $stmt->bindParam(':contenedor', $contenedor, PDO::PARAM_STR);

            $stmt->execute();

            $apartado = $stmt->fetchObject(__CLASS__);

            return (object)[
                'status' => 200,
                'message' => 'success',
                'data' => $apartado
            ];
        } catch (PDOException $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        } catch (Exception $e) {
            return (object)[
                'status' => 500,
                'message' => $e->getMessage()
            ];
        }
    }
}
