import datetime
import platform
import socket
from typing import Dict

# edited by glg


class DeviceRegistrationRequestBuilder:
    @staticmethod
    def parse_toko_id(toko_id):
        raw = str(toko_id or "").strip()
        if not raw:
            raise ValueError("Toko ID wajib diisi.")
        toko_id_int = int(raw)
        if toko_id_int <= 0:
            raise ValueError("Toko ID wajib angka lebih dari 0.")
        return toko_id_int

    @staticmethod
    def normalize_register_inputs(
        alias,
        keterangan,
        cabang_nama,
        cabang_id,
        nama_pengguna,
        web_admin_url,
        toko_id,
    ) -> Dict[str, str]:
        return {
            "alias": str(alias or "").strip(),
            "keterangan": str(keterangan or "").strip(),
            "cabang_nama": str(cabang_nama or "").strip(),
            "cabang_id": str(cabang_id or "").strip(),
            "nama_pengguna": str(nama_pengguna or "").strip(),
            "web_admin_url": str(web_admin_url or "").strip(),
            "toko_id": str(toko_id or "").strip(),
        }

    @staticmethod
    def has_required_register_fields(inputs: Dict[str, str]) -> bool:
        data = inputs if isinstance(inputs, dict) else {}
        required = [
            str(data.get("alias") or "").strip(),
            str(data.get("keterangan") or "").strip(),
            str(data.get("cabang_id") or "").strip(),
            str(data.get("web_admin_url") or "").strip(),
            str(data.get("toko_id") or "").strip(),
        ]
        return all(bool(item) for item in required)

    @staticmethod
    def generate_browser_verif() -> str:
        return str(int(datetime.datetime.now().timestamp()))

    @staticmethod
    def build_registration_payload(
        *,
        machine_id: str,
        browser_verif: str,
        alias: str,
        keterangan: str,
        cabang_nama: str,
        cabang_id: str,
        nama_pengguna: str,
        toko_id_int: int,
    ) -> Dict:
        return {
            "machine_id": str(machine_id or "").strip(),
            "browser_verif": str(browser_verif or "").strip(),
            "keterangan": str(keterangan or "").strip(),
            "cabang_nama": str(cabang_nama or "").strip(),
            "cabang_id": str(cabang_id or "").strip(),
            "cpu_info": platform.processor() or "",
            "com_info": socket.gethostname(),
            "alias": str(alias or "").strip(),
            "nama_pengguna": str(nama_pengguna or "").strip(),
            "toko_id": int(toko_id_int or 0),
        }

    @staticmethod
    def build_pending_local_payload(
        *,
        machine_id: str,
        browser_verif: str,
        alias: str,
        keterangan: str,
        cabang_nama: str,
        cabang_id: str,
        nama_pengguna: str,
        toko_id_int: int,
        cpu_info: str = "",
        com_info: str = "",
    ) -> Dict:
        return {
            "machine_id": str(machine_id or "").strip(),
            "browser_verif": str(browser_verif or "").strip(),
            "keterangan": str(keterangan or "").strip(),
            "cabang_nama": str(cabang_nama or "").strip(),
            "cabang_id": str(cabang_id or "").strip(),
            "cpu_info": str(cpu_info or platform.processor() or "").strip(),
            "com_info": str(com_info or socket.gethostname() or "").strip(),
            "alias": str(alias or "").strip(),
            "nama": str(nama_pengguna or "").strip(),
            "toko_id": int(toko_id_int or 0),
        }
