<?php
class TipoPlanilla
{
    public $id;
    public $codtipoplanilla;
    public $tipoPlanilla;
    public $aplicaBoletaPago = false;
    public $fechaRegistro;

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

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

        $query = "SELECT * FROM rrhh.view_tiposPlanilla WHERE estado = 1 ORDER BY codtipoplanilla ASC;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);

        try {
            $stmt->execute();

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

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

    public static function obtenerTodosParaCombo(): object
    {
        $solicitud = self::obtenerTodos();

        $tipos = $solicitud->status == 200 ? $solicitud->data : [];

        $tipos = array_map(function ($item) {
            return (object)[
                'id' => $item->id,
                'codtipoplanilla' => $item->codtipoplanilla,
                'tipoPlanilla' => $item->tipoPlanilla
            ];
        }, $tipos);

        return (object)[
            'status' => $solicitud->status,
            'message' => $solicitud->message,
            'data' => array_values($tipos)
        ];
    }

    public static function obtenerParaEnvioBoleta(): object
    {
        return (object)[
            'status' => 200,
            'message' => 'success',
            'data' => []
        ];
    }

    public static function obtenerPorUsuario($usuario, $db): object
    {
        $query = "SELECT config.idTipoPlanilla,
            config.codtipoplanilla,
            config.tipoPlanilla
        FROM rrhh.config_tiposPlanillaUsuario config
        WHERE config.idUsuario = :usuario;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);

        try {
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_OBJ);
            return (object)['status' => 200, 'message' => 'success', 'data' => $data];
        } catch (PDOException $e) {
            return (object)['status' => 500, 'message' => $e->getMessage()];
        }
    }

    public static function guardarAsignacionUsuario($usuario, $idTipoPlanilla, $codtipoplanilla, $tipoPlanilla, $db): object
    {
        $respuesta = null;

        $query = "EXEC rrhh.sp_guardarTipoPlanillaUsuario :usuario,:idTipoPlanilla,:codtipoplanilla,:tipoPlanilla,:respuesta;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $usuario, PDO::PARAM_INT);
        $stmt->bindParam(':idTipoPlanilla', $idTipoPlanilla, PDO::PARAM_INT);
        $stmt->bindParam(':codtipoplanilla', $codtipoplanilla, PDO::PARAM_INT);
        $stmt->bindParam(':tipoPlanilla', $tipoPlanilla, PDO::PARAM_STR);
        $stmt->bindParam(':respuesta', $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

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

    public static function limpiarAsignacionesPorUsuario($idUser, $tiposPlanillaValidos, $db): object
    {
        $strTiposPlanilla = count($tiposPlanillaValidos) > 0 ? implode(',', $tiposPlanillaValidos) : '0';
        $query = "EXEC rrhh.sp_limpiarTiposPlanillaUsuario :usuario,:tiposPlanillaValidos;";
        $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
        $stmt->bindParam(':usuario', $idUser, PDO::PARAM_INT);
        $stmt->bindParam(':tiposPlanillaValidos', $strTiposPlanilla, PDO::PARAM_STR);

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