"""
==================================================
Smart Attendance AI
Serializer Utility
==================================================
Converts Python objects into JSON-safe structures.
Supports:
- Dataclasses
- Lists / Tuples
- Dictionaries
- NumPy Arrays
- NumPy Scalars
- __slots__ objects
- __dict__ objects
==================================================
"""

from dataclasses import asdict, is_dataclass
from typing import Any

import numpy as np


class Serializer:

    # ==================================================
    # Generic Serializer
    # ==================================================

    @staticmethod
    def serialize(obj: Any):

        # ------------------------------------------
        # None
        # ------------------------------------------

        if obj is None:
            return None

        # ------------------------------------------
        # Primitive Types
        # ------------------------------------------

        if isinstance(obj, (str, int, float, bool)):
            return obj

        # ------------------------------------------
        # NumPy Scalar Types
        # ------------------------------------------

        if isinstance(obj, np.generic):
            return obj.item()

        # ------------------------------------------
        # NumPy Array
        # ------------------------------------------

        if isinstance(obj, np.ndarray):
            return obj.tolist()

        # ------------------------------------------
        # Dataclass
        # ------------------------------------------

        if is_dataclass(obj):

            data = asdict(obj)

            return Serializer.serialize(data)

        # ------------------------------------------
        # Dictionary
        # ------------------------------------------

        if isinstance(obj, dict):

            return {

                key: Serializer.serialize(value)

                for key, value in obj.items()

            }

        # ------------------------------------------
        # List / Tuple / Set
        # ------------------------------------------

        if isinstance(obj, (list, tuple, set)):

            return [

                Serializer.serialize(item)

                for item in obj

            ]

        # ------------------------------------------
        # Objects using __slots__
        # ------------------------------------------

        if hasattr(obj, "__slots__"):

            return {

                slot: Serializer.serialize(

                    getattr(obj, slot)

                )

                for slot in obj.__slots__

            }

        # ------------------------------------------
        # Objects using __dict__
        # ------------------------------------------

        if hasattr(obj, "__dict__"):

            return {

                key: Serializer.serialize(value)

                for key, value in obj.__dict__.items()

            }

        # ------------------------------------------
        # Fallback
        # ------------------------------------------

        return str(obj)

    # ==================================================
    # Backward Compatibility
    # ==================================================

    @staticmethod
    def serialize_list(items):

        return Serializer.serialize(items)

    @staticmethod
    def face_results(results):

        return Serializer.serialize(results)