<?php
namespace App\Controllers;

class ProxyController {
    const VALID_TIKTOK_DOMAINS = [
        "tiktokcdn.com", "tiktokcdn-us.com", "tiktok.com"
    ];

    static private function isValidDomain(string $url) {
        $host = parse_url($url, PHP_URL_HOST);
        $host_split = explode('.', $host);
        $host_count = count($host_split);
        if ($host_count === 2) {
            // Using no watermark
            return in_array($host_split[0] . '.' . $host_split[1], self::VALID_TIKTOK_DOMAINS);
        } elseif ($host_count === 3) {
            return in_array($host_split[1] . '.' . $host_split[2], self::VALID_TIKTOK_DOMAINS);
        }
        return false;
    }

    static private function checkUrl() {
        if (!isset($_GET['url'])) {
            die('You need to send a URL');
        }

        if (!filter_var($_GET['url'], FILTER_VALIDATE_URL) || !self::isValidDomain($_GET['url'])) {
            die('Not a valid URL');
        }

    }

    static private function getFileName(): string {
        $filename = 'tiktok-video';
        if (isset($_GET['user'])) {
            $filename .= '-' . $_GET['user'] . '-' . $_GET['id'];
        }
        return $filename;
    }

    static public function stream() {
        if (isset($_GET['download'])) {
            $watermark = isset($_GET['watermark']);
            if ($watermark) {
                self::checkUrl();
                $filename = self::getFileName();
                $downloader = new \Sovit\TikTok\Download();
                $downloader->url($_GET['url'], $filename, true);
            } else {
                if (!isset($_GET['id'])) {
                    die('You need to send an ID!');
                }
                $filename = self::getFileName();
                $downloader = new \Sovit\TikTok\Download();
                $downloader->url($_GET['id'], $filename, false);
            }
        } else {
            self::checkUrl();
            $url = $_GET['url'];
            $streamer = new \Sovit\TikTok\Stream();
            $streamer->stream($url);
        }
    }
}