<?php
/* Copyright (C) 2014 Daniel Preussker <f0o@devilcode.org>, Tyler Christiansen <code@tylerc.me>
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. */

/*
 * API Transport
 * @author Tyler Christiansen <code@tylerc.me>
 * @copyright 2014 Daniel Preussker, Tyler Christiansen, LibreNMS
 * @license GPL
 * @package LibreNMS
 * @subpackage Alerts
 */
namespace LibreNMS\Alert\Transport;

use LibreNMS\Interfaces\Alert\Transport;

class Hipchat implements Transport
{
    public function deliverAlert($obj, $opts)
    {
        // loop through each room
        foreach ($opts as $option) {
            $version = 1;
            if (stripos($option['url'], "v2")) {
                $version = 2;
            }

            // Generate our URL from the base URL + room_id and the auth token if the version is 2.
            $url = $option['url'];
            if ($version == 2) {
                $url .= "/" . urlencode($option["room_id"]) . "/notification?auth_token=" . urlencode($option["auth_token"]);
            }
            foreach ($obj as $key => $value) {
                $api = str_replace("%" . $key, $method == "get" ? urlencode($value) : $value, $api);
            }
            $curl = curl_init();

            if (empty($obj["msg"])) {
                return "Empty Message";
            }

            if (empty($option["message_format"])) {
                $option["message_format"] = 'text';
            }

            // Sane default of making the message color green if the message indicates
            // that the alert recovered.   If it rebooted, make it yellow.
            if (stripos($obj["msg"], "recovered")) {
                $color = "green";
            } elseif (stripos($obj["msg"], "rebooted")) {
                $color = "yellow";
            } else {
                if (empty($option["color"]) || $option["color"] == 'u') {
                    $color = 'red';
                } else {
                    $color = $option["color"];
                }
            }


            $data[] = "message=" . urlencode($obj["msg"]);
            if ($version == 1) {
                $data[] = "room_id=" . urlencode($option["room_id"]);
            }
            $data[] = "from=" . urlencode($option["from"]);
            $data[] = "color=" . urlencode($color);
            $data[] = "notify=" . urlencode($option["notify"]);
            $data[] = "message_format=" . urlencode($option["message_format"]);

            $data = implode('&', $data);
            set_curl_proxy($curl);
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/x-www-form-urlencoded',
            ));
            $ret = curl_exec($curl);

            $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
            if ($code != 200 && $code != 204) {
                var_dump("API '$url' returned Error");
                var_dump("Params: " . $message);
                var_dump("Return: " . $ret);
                return 'HTTP Status code ' . $code;
            }
        }
        return true;
    }
}
