<?php
require_once 'config.php'; // To load environment variables and constants

function get_mpd_url($id, $file_data, $ks, $user_d) {
    $storageFile = '/var/www/html/proxy/tokenized_urls.json';

    $data = file_exists($storageFile) ? json_decode(file_get_contents($storageFile), true) : [];
    $channel_data = find_channel_by_number($id, $file_data);
    $uid = $channel_data['UID'];
    $currentTime = time();

    if (isset($data[$uid])) {
        $savedTimestamp = $data[$uid]['generated_time'];

        if (($currentTime - $savedTimestamp) < 300) {
            $data[$uid]['access_time'] = $currentTime;
            file_put_contents($storageFile, json_encode($data));
            return $data[$uid]['url'];
        }
    }

    $newUrl = m_url($uid, $ks, $user_d);
    $newUrl = tempurl($newUrl);
    $data[$uid] = [
        'url' => $newUrl,
        'generated_time' => $currentTime,
        'access_time' => $currentTime
    ];

    file_put_contents($storageFile, json_encode($data));
    return $newUrl;
}

function tempurl($url) {
    $proxy = getenv('PROXY_ADDRESS');
    $proxyAuth = getenv('PROXY_AUTH');

    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_PROXY => $proxy,
        CURLOPT_PROXYUSERPWD => $proxyAuth,
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'GET',
    ]);

    $response = curl_exec($curl);
    $headers = curl_getinfo($curl);
    $location = $headers['redirect_url'] ?? null;
    curl_close($curl);

    return $location;
}

function m_url($uid, $token, $user_d) {
    $headers = ['Authorization: Bearer ' . $token];
    $params = http_build_query(['translation' => 'en']);
    $url = "https://api1.viu.lk/api/client/v1/default/users/$user_d/live/channels/$uid?$params";

    $curl = curl_init();
    curl_setopt_array($curl, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_PROXY => getenv('PROXY_ADDRESS'),
        CURLOPT_PROXYUSERPWD => getenv('PROXY_AUTH')
    ]);

    $response = curl_exec($curl);
    curl_close($curl);
    $data = json_decode($response, true);

    return $data['data']['url'] ?? null;
}

function find_channel_by_number($channel_number, $file_data) {
    foreach ($file_data as $channel) {
        if ($channel['Channel No'] == $channel_number) {
            return $channel;
        }
    }
    return null;
}

function decfunc($data, $key) {
    $data = base64_decode($data);
    $decrypted = '';
    for ($i = 0, $len = strlen($data); $i < $len; $i++) {
        $decrypted .= chr(ord($data[$i]) ^ ord($key[$i % strlen($key)]));
    }
    return $decrypted;
}

// Database Connection
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($conn->connect_error) {
    error_log("Database Connection Failed: " . $conn->connect_error);
    header('Location: https://watch.livecricketsl.xyz/playlist/exp.mpd');
    exit;
}

// Extract and decrypt user details
$deckey = DECRYPTION_KEY;
$user_agent = $_SERVER['HTTP_USER_AGENT'];
preg_match('/TiviMate\((.*?)\)/', $user_agent, $matches);
$valueenc = $matches[1] ?? '';
$value = explode('!', decfunc($valueenc, $deckey));
$id = $value[0] ?? '';
$user_id = $value[1] ?? '';

// Load JSON configuration files
$device = DEVICE_FILE_1;
$inputJsonFile = CHANNEL_FILE;
$device_data = json_decode(file_get_contents($device), true);
$file_data = json_decode(file_get_contents($inputJsonFile), true);
$user_d = $device_data['user_id'] ?? '';

// Validate user login
$stmt = $conn->prepare("SELECT status FROM logins_1_dev WHERE user_id = ? LIMIT 1");
$stmt->bind_param('s', $user_id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stu = $row['status'] ?? 0;
$stmt->close();

if ($stu != '1') {
    header('Location: https://watch.livecricketsl.xyz/playlist/exp.mpd');
    exit;
}

// Check payment status
$stmt = $conn->prepare("SELECT act_time, valid_till, status FROM payments_1_dev WHERE user_id = ?");
$stmt->bind_param('s', $user_id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stmt->close();

$time = strtotime("+{$row['valid_till']} days", strtotime($row['act_time']));
$now = time();

if ($time > $now && $row['status'] == '1') {
    $channel_data = find_channel_by_number($id, $file_data);
    $uid = $channel_data['UID'] ?? '';
    $ks = $device_data['ks'] ?? '';

    $url = m_url($uid, $ks, $user_d);

    if (isset($_GET['utc'])) {
        $begin = date('Ymd\THis', $_GET['utc']);
        $end = date('Ymd\THis', $_GET['lutc']);
        $url .= "&begin=$begin&end=$end";
    }

    header('Location: ' . $url);
} else {
    if ($row['status'] == '1') {
        $stmt = $conn->prepare("UPDATE payments_1_dev SET valid_till = 30, payment = 'unpaid', status = 0 WHERE user_id = ?");
        $stmt->bind_param('s', $user_id);
        $stmt->execute();
        $stmt->close();
    }

    header('Location: https://watch.livecricketsl.xyz/playlist/exp.mpd');
}
?>
