<?php

namespace App;

use URL;

abstract class Document
{
    protected $password;
    protected $baseUrl;

    public function __construct($password, $base)
    {
        $this->password = $password;
        $this->baseUrl  = $base;
    }

    public function proxifyFormAction($url){
        $url = trim($url);
        if (stripos($url, "javascript:") === 0) {
            return "";
        }

        // Deny Loading internal URLs and check if URL syntax is correct
        $host = parse_url($url, PHP_URL_HOST);
        $selfHost = \Request::getHttpHost();
        if (strpos($url, "http") !== 0 || $host === false || $host === $selfHost) {
            return $url;
        }

        return \App\Http\Controllers\ProxyController::generateFormgetUrl($url);
    }

    public function proxifyUrl($url, $topLevel)
    {
        // Only convert valid URLs
        $url = trim($url);

        if (stripos($url, "javascript:") === 0) {
            return "";
        }

        // Deny Loading internal URLs and check if URL syntax is correct
        $host = parse_url($url, PHP_URL_HOST);
        $selfHost = \Request::getHttpHost();
        if (strpos($url, "http") !== 0 || $host === false || $host === $selfHost) {
            return $url;
        }

        if($topLevel){
            return \App\Http\Controllers\ProxyController::generateProxyWrapperUrl($url);
        }else{
            return \App\Http\Controllers\ProxyController::generateProxyUrl($url);
        }
    }

    protected function convertRelativeToAbsoluteLink($rel)
    {
        if (strpos($rel, "//") === 0) {
            $rel = parse_url($this->baseUrl, PHP_URL_SCHEME) . ":" . $rel;
        }

        /* return if already absolute URL or empty URL */
        if (parse_url($rel, PHP_URL_SCHEME) != ''
            || strlen(trim($rel)) <= 0
            || preg_match("/^\s*mailto:/si", $rel)) {
            return ($rel);
        }

        /* queries and anchors */
        if ($rel[0] == '#' || $rel[0] == '?') {
            return ($this->baseUrl . $rel);
        }

        /* parse base URL and convert to local variables:
        $scheme, $host, $path */
        extract(parse_url($this->baseUrl));

        /* remove non-directory element from path */
        if (isset($path)) {
            $path = preg_replace('#/[^/]*$#', '', $path);
        }

        /* destroy path if relative url points to root */
        if ($rel[0] == '/') {
            $path = '';
        }

        /* dirty absolute URL */
        $abs = '';

        /* do we have a user in our URL? */
        if (isset($user)) {
            $abs .= $user;

            /* password too? */
            if (isset($pass)) {
                $abs .= ':' . $pass;
            }

            $abs .= '@';
        }

        if (!isset($host)) {
            #die(var_dump($this->baseUrl));
        }

        $abs .= $host;
        /* did somebody sneak in a port? */
        if (isset($port)) {
            $abs .= ':' . $port;
        }

        if (isset($path)) {
            $abs .= $path;
        }
        if (isset($rel)) {
            $abs .= "/" . ltrim($rel, "/");
        }
        /* replace '//' or '/./' or '/foo/../' with '/' */
        $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#');
        for ($n = 1; $n > 0; $abs = preg_replace($re, '/', $abs, -1, $n)) {
        }

        /* absolute URL is ready! */
        return ($scheme . '://' . $abs);
    }

    abstract public function proxifyContent();
}