<?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);
    }
}
