

import dataclasses
from dataclasses import Field, asdict, dataclass

from google.api_core.datetime_helpers import DatetimeWithNanoseconds


@dataclass(kw_only=True)
class DocumentData:
    uid:str = ""
    enterpriseId:str = ""
    createdAt:DatetimeWithNanoseconds = DatetimeWithNanoseconds.now()
    updatedAt:DatetimeWithNanoseconds = DatetimeWithNanoseconds.now()
    id:str=""

    @classmethod
    def from_dict(cls, data):
        if isinstance(data, cls): return data
        data = {**data}
        return cls(**{
            field.name: convert(field, data.get(field.name)) for field in dataclasses.fields(cls)
        })
    
    def __post_init__(self):
        validate(self)

    def to_dict(self):
        return asdict(self)

def convert(field:Field, value):
    if value in [None]: return None
    if field.type == int: return int(value)
    elif field.type == str: return str(value)
    elif field.type == float: return float(value)
    return value

def validate(cls):
    for field in dataclasses.fields(cls):
        value = getattr(cls, field.name)
        if field.type in [str,int,float,None,bool] and not isinstance(value, field.type): 
            setattr(cls, field.name, convert(field, value))