from exceptions import DeadPlantError
from plant import Plant


class Bed:
    _WATERING_THRESHOLD = 5

    def __init__(self, location: str) -> None:
        self.location = location
        self._plants = []
        self.water_level = 0

    def __repr__(self) -> str:
        return f"Bed {self.location}"

    def __str__(self) -> str:
        return (f"{self!r}\n"
                f"Water level: {self.water_level}\n"
                f"{len(self.plants)} plants: {[p.species for p in self.plants]}")

    @property
    def water_level(self) -> int:
        return self._water_level

    @water_level.setter
    def water_level(self, water_level: int):
        if water_level < 0:
            raise ValueError(f"No more water in {self!r}.")
        self._water_level = water_level

    @property
    def plants(self) -> list:
        return self._plants

    @plants.deleter
    def plants(self):
        self._plants.clear()

    @property
    def needs_water(self) -> bool:
        return self.water_level < self._WATERING_THRESHOLD

    def plant_plant(self, plant: Plant) -> None:
        self.plants.append(plant)

    def water(self, added_water: int = 1) -> None:
        self.water_level += added_water

    def update(self) -> None:
        for plant in self.plants:
            try:
                self.water_level -= 1
                plant.grow()
            except ValueError:
                print(f"{self!r} is out of water, plants can't grow")
                return
            except DeadPlantError:
                print(f"{plant!r} in {self!r} is dead and should be removed quickly!")

    def harvest(self) -> list:
        harvested = []
        for plant in self.plants:
            harvested.extend(plant.harvest())
        return harvested