<?php
/**
 * Media uploader class
 */
class WhatsMediaUploader
{
    protected static function sendData($host, $POST, $HEAD, $filepath, $mediafile, $TAIL)
    {
        $sock = fsockopen("ssl://" . $host, 443);

        fwrite($sock, $POST);
        fwrite($sock, $HEAD);

        //write file data
        $buf       = 1024;
        $totalread = 0;
        $fp        = fopen($filepath, "r");
        while ($totalread < $mediafile['filesize']) {
            $buff = fread($fp, $buf);
            fwrite($sock, $buff, $buf);
            $totalread += $buf;
        }
        //echo $TAIL;
        fwrite($sock, $TAIL);
        sleep(1);

        $data = fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        $data .= fgets($sock, 8192);
        fclose($sock);

        list($header, $body) = preg_split("/\R\R/", $data, 2);

        $json = json_decode($body);
        if ( ! is_null($json)) {
            return $json;
        }
        return false;
    }

    public static function pushFile($uploadResponseNode, $messageContainer, $mediafile, $selfJID)
    {
        //get vars
        $url      = $uploadResponseNode->getChild("media")->getAttribute("url");
        $filepath = $messageContainer["filePath"];
        $to       = $messageContainer["to"];
        return self::getPostString($filepath, $url, $mediafile, $to, $selfJID);
    }

    protected static function getPostString($filepath, $url, $mediafile, $to, $from)
    {
        $host = parse_url($url, PHP_URL_HOST);

        //filename to md5 digest
        $cryptoname    = md5($filepath) . "." . $mediafile['fileextension'];
        $boundary      = "zzXXzzYYzzXXzzQQ";

        if (is_array($to)) {
            $to = implode(',', $to);
        }

        $hBAOS = "--" . $boundary . "\r\n";
        $hBAOS .= "Content-Disposition: form-data; name=\"to\"\r\n\r\n";
        $hBAOS .= $to . "\r\n";
        $hBAOS .= "--" . $boundary . "\r\n";
        $hBAOS .= "Content-Disposition: form-data; name=\"from\"\r\n\r\n";
        $hBAOS .= $from . "\r\n";
        $hBAOS .= "--" . $boundary . "\r\n";
        $hBAOS .= "Content-Disposition: form-data; name=\"file\"; filename=\"" . $cryptoname . "\"\r\n";
        $hBAOS .= "Content-Type: " . $mediafile['filemimetype'] . "\r\n\r\n";

        $fBAOS = "\r\n--" . $boundary . "--\r\n";

        $contentlength = strlen($hBAOS) + strlen($fBAOS) + $mediafile['filesize'];

        $POST = "POST " . $url . "\r\n";
        $POST .= "Content-Type: multipart/form-data; boundary=" . $boundary . "\r\n";
        $POST .= "Host: " . $host . "\r\n";
        $POST .= "User-Agent: " . Constants::WHATSAPP_USER_AGENT . "\r\n";
        $POST .= "Content-Length: " . $contentlength . "\r\n\r\n";

        return self::sendData($host, $POST, $hBAOS, $filepath, $mediafile, $fBAOS);
    }
}
