from collections import UserList
from .event import Event

class Filter:
    def __init__(
            self, 
            ids: "list[str]"=None, 
            kinds: "list[int]"=None, 
            authors: "list[str]"=None, 
            since: int=None, 
            until: int=None, 
            tags: "dict[str, list[str]]"=None,
            limit: int=None) -> None:
        self.IDs = ids
        self.kinds = kinds
        self.authors = authors
        self.since = since
        self.until = until
        self.tags = tags
        self.limit = limit

    def matches(self, event: Event) -> bool:
        if self.IDs != None and event.id not in self.IDs:
            return False
        if self.kinds != None and event.kind not in self.kinds:
            return False
        if self.authors != None and event.public_key not in self.authors:
            return False
        if self.since != None and event.created_at < self.since:
            return False
        if self.until != None and event.created_at > self.until:
            return False
        if self.tags != None and len(event.tags) == 0:
            return False
        if self.tags != None:
            e_tag_identifiers = [e_tag[0] for e_tag in event.tags] 
            for f_tag, f_tag_values in self.tags.items():
                if f_tag[1:] not in e_tag_identifiers:
                    return False
                for e_tag in event.tags:
                    if e_tag[1] not in f_tag_values:
                        return False
        
        return True

    def to_json_object(self) -> dict:
        res = {}
        if self.IDs != None:
            res["ids"] = self.IDs
        if self.kinds != None:   
            res["kinds"] = self.kinds
        if self.authors != None:
            res["authors"] = self.authors
        if self.since != None:
            res["since"] = self.since
        if self.until != None:
            res["until"] = self.until
        if self.tags != None:
            for tag, values in self.tags.items():
                res[tag] = values
        if self.limit != None:
            res["limit"] = self.limit

        return res
                
class Filters(UserList):
    def __init__(self, initlist: "list[Filter]"=[]) -> None:
        super().__init__(initlist)
        self.data: "list[Filter]"

    def match(self, event: Event):
        for filter in self.data:
            if filter.matches(event):
                return True
        return False

    def to_json_array(self) -> list:
        return [filter.to_json_object() for filter in self.data]
        