<?php
class Bono
{
    public $id;
    public $idTipo;
    public $codtipoplanilla;
    public $tipo;
    public $descripcion;
    public $idPeriodicidad;
    public $periodicidad;
    public $fechaPago;
    public $mesPago;
    public $planillaPago;
    public $empleados;
    public $monto;
    public $detalles = [];
    public $fechaRegistro;
    public $fechaModificacion;
    public $ultimaAplicacion;
    public $estado;
    public $usuario;

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

    public static function obtenerPorTipoPlanilla($codtipoplanilla): object
    {
        try {
            $db = obtenerConexion();

            $query = "SELECT * FROM rrhh.view_bonos where estado = 1 AND codtipoplanilla = :codtipoplanilla;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":codtipoplanilla", $codtipoplanilla, PDO::PARAM_INT);

            $stmt->execute();

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

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

    public static function obtenerDetalles($id): object
    {
        try {
            $db = obtenerConexion();

            $query = "SELECT * FROM rrhh.view_detallesBono WHERE idBono = :id and estado = 1;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":id", $id, PDO::PARAM_INT);

            $stmt->execute();

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

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

    public function guardar(): object
    {
        try {
            $db = obtenerConexion();

            $db->beginTransaction();

            $respuesta = null;
            $id = null;
            $usuario = App::obtenerIdUsuario();

            !empty($this->fechaPago) && $this->fechaPago = date('Y-m-d', strtotime($this->fechaPago));

            $query = "EXEC rrhh.sp_guardarBono :id,:tipoPlanilla,:idTipo,:descripcion,:idPeriodicidad,:fechaPago,:mesPago,:planillaPago,:monto,:usuario,:respuesta,:idBono;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":id", $this->id, PDO::PARAM_INT);
            $stmt->bindParam(":tipoPlanilla", $this->codtipoplanilla, PDO::PARAM_INT);
            $stmt->bindParam(":idTipo", $this->idTipo, PDO::PARAM_INT);
            $stmt->bindParam(":descripcion", $this->descripcion, PDO::PARAM_STR);
            $stmt->bindParam(":idPeriodicidad", $this->idPeriodicidad, PDO::PARAM_INT);
            $stmt->bindParam(":fechaPago", $this->fechaPago, PDO::PARAM_STR);
            $stmt->bindParam(":mesPago", $this->mesPago, PDO::PARAM_STR);
            $stmt->bindParam(":planillaPago", $this->planillaPago, PDO::PARAM_INT);
            $stmt->bindParam(":monto", $this->monto, PDO::PARAM_STR);
            $stmt->bindParam(":usuario", $usuario, PDO::PARAM_INT);
            $stmt->bindParam(":respuesta", $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
            $stmt->bindParam(":idBono", $id, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

            if ($respuesta == 'success') {
                $this->id = $id;

                $arrDetalles = [];

                foreach ($this->detalles as $detalle) {
                    $subRespuesta = null;
                    $idDetalle = null;
                    $query = "EXEC rrhh.sp_guardarDetalleBono :id,:idBono,:idTipoAsignacion,:idAsignacion,:usuario,:respuesta,:idDetalle;";
                    $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
                    $stmt->bindParam(":id", $detalle["id"], PDO::PARAM_INT);
                    $stmt->bindParam(":idBono", $this->id, PDO::PARAM_INT);
                    $stmt->bindParam(":idTipoAsignacion", $detalle["idTipoAsignacion"], PDO::PARAM_INT);
                    $stmt->bindParam(":idAsignacion", $detalle["idAsignacion"], PDO::PARAM_INT);
                    $stmt->bindParam(":usuario", $usuario, PDO::PARAM_INT);
                    $stmt->bindParam(":respuesta", $subRespuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);
                    $stmt->bindParam(":idDetalle", $idDetalle, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 300);

                    $stmt->execute();

                    if ($subRespuesta != "success") {
                        throw new Exception(!empty($subRespuesta) ? $subRespuesta : "Error al guardar el detalle del bono");
                    }

                    $arrDetalles[] = $idDetalle;
                }

                $strDetalles = count($arrDetalles) > 0 ? implode(",", $arrDetalles) : "0";

                $query = "EXEC rrhh.sp_limpiarDetalleBono :idBono,:detallesValidos;";
                $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
                $stmt->bindParam(":idBono", $this->id, PDO::PARAM_INT);
                $stmt->bindParam(":detallesValidos", $strDetalles, PDO::PARAM_STR);

                $stmt->execute();
            }

            $db->commit();

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

    public function eliminar(): object
    {
        try {
            $db = obtenerConexion();

            $respuesta = null;
            $usuario = App::obtenerIdUsuario();

            $query = "EXEC rrhh.sp_eliminarBono :id,:usuario,:respuesta;";
            $stmt = $db->prepare($query, [PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
            $stmt->bindParam(":id", $this->id, PDO::PARAM_INT);
            $stmt->bindParam(":usuario", $usuario, PDO::PARAM_INT);
            $stmt->bindParam(":respuesta", $respuesta, PDO::PARAM_STR | PDO::PARAM_INPUT_OUTPUT, 300);

            $stmt->execute();

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