#!/usr/bin/env python
# -*- coding: utf-8 -*-
import platform
import psutil
import subprocess
import re
import datetime
import base64
import json
from typing import Dict
from flask import Flask, jsonify, request
app = Flask(__name__)
class SystemInfoEncoder:
    @staticmethod
    def encrypt_system_info(info: Dict) -> str:
        system_data = {
            "os": info["os"],
            "cpu": info["processor"],
            "ram": info["ram"],
        }
        json_str = json.dumps(system_data)
        return base64.b64encode(json_str.encode('utf-8')).decode('utf-8')
    @staticmethod
    def decrypt_system_info(encrypted_str: str) -> Dict:
        decoded_bytes = base64.b64decode(encrypted_str)
        return json.loads(decoded_bytes.decode('utf-8'))
class SystemInfo:
    def __init__(self):
        self.os_info = self._get_os_info()
        self.cpu_info = self._get_cpu_info()
        self.ram_info = self._get_ram_info()
    def _get_os_info(self) -> str:
        try:
            version = platform.win32_ver()
            return f"Windows {version[0]} (Build {version[1]})"
        except:
            return "Unknown Windows Version"
    def _get_cpu_info(self) -> str:
        methods = [
            self._get_cpu_via_wmic,
            self._get_cpu_via_powershell,
            self._get_cpu_via_registry
        ]
        
        for method in methods:
            try:
                if cpu_info := method():
                    return self._clean_cpu_name(cpu_info)
            except:
                continue
        return platform.processor() or "Unknown Processor"
    def _get_cpu_via_wmic(self) -> str:
        output = subprocess.check_output(
            "wmic cpu get name",
            shell=True,
            text=True,
            stderr=subprocess.DEVNULL,
            timeout=3
        )
        lines = [line.strip() for line in output.split('\n') if line.strip()]
        return lines[1] if len(lines) > 1 else None
    def _get_cpu_via_powershell(self) -> str:
        command = 'powershell -command "Get-WmiObject Win32_Processor | Select-Object -ExpandProperty Name"'
        return subprocess.check_output(
            command,
            shell=True,
            text=True,
            stderr=subprocess.DEVNULL,
            timeout=3
        ).strip()
    def _get_cpu_via_registry(self) -> str:
        command = (
            'reg query "HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\'
            'CentralProcessor\\0" /v ProcessorNameString'
        )
        output = subprocess.check_output(
            command,
            shell=True,
            text=True,
            stderr=subprocess.DEVNULL,
            timeout=3
        )
        if "ProcessorNameString" in output:
            return output.split("REG_SZ")[-1].strip()
        return None
    def _get_ram_info(self) -> str:
        try:
            ram_gb = psutil.virtual_memory().total // (1024 ** 3)
            return f"{ram_gb} GB"
        except:
            return "Unknown RAM"
    @staticmethod
    def _clean_cpu_name(cpu_name: str) -> str:
        return re.sub(r'\s+', ' ', cpu_name).strip()
    def get_full_info(self) -> Dict:
        return {
            "os": self.os_info,
            "processor": self.cpu_info,
            "ram": self.ram_info
        }
system_info = SystemInfo()
@app.route('/system-info', methods=['GET'])
def get_system_info():
    if request.args.get('encrypted') == 'true':
        encrypted = SystemInfoEncoder.encrypt_system_info(system_info.get_full_info())
        return jsonify({"encrypted_data": encrypted})
    
    return jsonify({
        "data": system_info.get_full_info(),
    })
@app.route('/decode-info', methods=['POST'])
def decode_info():
    try:
        encrypted_data = request.json.get('encrypted_data')
        if not encrypted_data:
            return jsonify({"error": "Не предоставлены данные"}), 400
        
        decrypted = SystemInfoEncoder.decrypt_system_info(encrypted_data)
        return jsonify({
            "status": "success",
            "decrypted_data": decrypted
        })
    except Exception as e:
        return jsonify({"error": str(e)}), 400
if __name__ == '__main__':
    print("\nТестирование шифрования:")
    sample_data = system_info.get_full_info()
    encrypted = SystemInfoEncoder.encrypt_system_info(sample_data)
    decrypted = SystemInfoEncoder.decrypt_system_info(encrypted)
    
    print(f"Оригинальные данные: {sample_data}")
    print(f"Зашифрованная строка (первые 50 символов): {encrypted[:50]}...")
    print(f"Расшифрованные данные: {decrypted}")
    
    app.run(host='0.0.0.0', port=8181, debug=False)