import inspect
from dataclasses import dataclass
from datetime import datetime
from typing import Optional

from configs.firebase import db
from V2.functions.main import DocumentData


@dataclass
class User:
    uid:str
    enterpriseId:str
    email:str
    displayName:Optional[str]
    photoURL:Optional[str]
    createdAt:Optional[datetime]
    updatedAt: datetime | None = None
    isEnterpriseAdmin:Optional[bool] = False
    isProUser: Optional[bool] = False
    locationId: Optional[str] = None
    connectAccountId: Optional[str] = None
    planId: Optional[str] = None
    number: Optional[int] = 0

    @classmethod
    def from_dict(cls, data):
        return cls(**{
            k: data.get(k) for k in inspect.signature(cls).parameters
        })
    
    def update(self, **kwargs):
        db.document(f"users/{self.uid}").update(kwargs)
        return dict(uid=self.uid, **kwargs)
    
    @classmethod
    def get(cls,uid:str):
        ref = db.document(f"users/{uid}").get()
        if ref.exists: return cls.from_dict(ref.to_dict())
        return None
    
@dataclass
class Enterprise(DocumentData):
    id:str
    uid:str
    createdAt:Optional[datetime]
    updatedAt: datetime | None = None
    planId: str | None = None
    name:str| None = None

    @classmethod
    def from_dict(cls, data):
        return cls(**{
            k: data.get(k) for k in inspect.signature(cls).parameters
        })
    
    @classmethod
    def get(cls,id:str):
        ref = db.document(f"enterprises/{id}").get()
        if ref.exists: return cls.from_dict(ref.to_dict())
        return None

def getUser(uid:str) -> User | None:
    ref = db.document(f"users/{uid}").get()
    if ref.exists: return User.from_dict(ref.to_dict())
    return None

def getEnterpriseByHostname(hostname):
    ref = db.collection("enterprises").where("catalogDomains", "array_contains", hostname).get()
    return ref[0].to_dict()