from abc import ABC, abstractmethod
from typing_extensions import override
from world.commons.field_landmarks import FieldLandmarks


class Field(ABC):
    def __init__(self, world):
        from world.world import World  # type hinting
        self.world: World = world
        self.field_landmarks: FieldLandmarks = FieldLandmarks(world=self.world)

    def get_our_goal_position(self):
        return (-self.get_length() / 2, 0)

    def get_their_goal_position(self):
        return (self.get_length() / 2, 0)

    @abstractmethod
    def get_width(self):
        raise NotImplementedError()

    @abstractmethod
    def get_length(self):
        raise NotImplementedError()


class FIFAField(Field):
    def __init__(self, world):
        super().__init__(world)

    @override
    def get_width(self):
        return 68

    @override
    def get_length(self):
        return 105


class HLAdultField(Field):
    def __init__(self, world):
        super().__init__(world)

    @override
    def get_width(self):
        return 9

    @override
    def get_length(self):
        return 14

class Soccer7vs7Field(Field):
    def __init__(self, world):
        super().__init__(world)

    @override
    def get_width(self):
        return 36

    @override
    def get_length(self):
        return 55
