from typing import Optional
from dataclasses import dataclass

@dataclass
class Detection:
    TYPE_NAME = "detection"

    def __hash__(self) -> int:
        return (type(self), *(self.__dict__.values())).__hash__()


class MorphosyntacticInfoMixin:
    def __init__(self, morpho_tag: str, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self._morpho_tag = morpho_tag

    @property
    def morpho_tag(self) -> str:
        return self._morpho_tag


class NameDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "name"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)


class SurnameDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "surname"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)

class LocationDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "location"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)

class OrganizationNameDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "organization_name"
    
    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)
        
def ProperNameDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "proper_name"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)

class TitleDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "title"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)

class HydronymDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "hydronym"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)

class StreetNameDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "street_name"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)


class CityDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "city"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)



class CountryDetection(MorphosyntacticInfoMixin, Detection):
    TYPE_NAME = "country"

    def __init__(self, morpho_tag: Optional[str] = None) -> None:
        super().__init__(morpho_tag=morpho_tag)


class UrlDetection(Detection):
    TYPE_NAME = "url"

    def __init__(self) -> None:
        super().__init__()


class UserDetection(Detection):
    TYPE_NAME = "user"

    def __init__(self) -> None:
        super().__init__()


class EmailDetection(Detection):
    TYPE_NAME = "email"

    def __init__(self) -> None:
        super().__init__()


class NumberDetection(Detection):
    TYPE_NAME = "number"

    def __init__(self) -> None:
        super().__init__()


class PhoneNumberDetection(NumberDetection):
    TYPE_NAME = "phone_number"

    def __init__(self) -> None:
        super().__init__()


class TINDetection(Detection):  # Tax Identification Number
    TYPE_NAME = "tin"

    def __init__(self) -> None:
        super().__init__()


class KRSDetection(Detection):  # National Court Register
    TYPE_NAME = "krs"

    def __init__(self) -> None:
        super().__init__()

class SerialNumberDetection(Detection):
    TYPE_NAME = "serial_number"

    def __init__(self) -> None:
        super().__init__()

class OtherDetection(Detection):  # Non standard entity
    TYPE_NAME = "other"

    def __init__(self) -> None:
        super().__init__()