from random import randint
from typing import Tuple

import pygame

from domain.commands.command import Command
from domain.entities.cat import Cat
from domain.world import World


class RandomCatMoveCommand(Command):
    def __init__(self, world: World, cat: Cat) -> None:
        super().__init__()
        self.world = world
        self.cat = cat

    def run(self):
        move_vector = (0, 0)
        now = pygame.time.get_ticks()
        # region cat random movement
        cat = self.world.cat
        if now - cat.last_tick >= cat.cooldown:
            if not cat.busy:
                while True:
                    cat.direction = randint(0, 3)
                    if not (
                        (cat.direction == 0 and cat.y == 0)
                        or (cat.direction == 1 and cat.x == self.world.width - 1)
                        or (cat.direction == 2 and cat.y == self.world.height - 1)
                        or (cat.direction == 3 and cat.x == 0)
                    ):
                        break

            if cat.direction == 0:  # up
                if cat.busy:
                    move_vector = (0, -1)
                cat.busy = not cat.busy
            if cat.direction == 1:  # right
                if cat.busy:
                    move_vector = (1, 0)
                cat.busy = not cat.busy
            if cat.direction == 2:  # down
                if cat.busy:
                    move_vector = (0, 1)
                cat.busy = not cat.busy
            if cat.direction == 3:  # left
                if cat.busy:
                    move_vector = (-1, 0)
                cat.busy = not cat.busy
            cat.last_tick = pygame.time.get_ticks()

        if move_vector == (0, 0):
            return

        end_x = cat.x + move_vector[0]
        end_y = cat.y + move_vector[1]

        if (
            end_x > self.world.width - 1
            or end_y > self.world.height - 1
            or end_x < 0
            or end_y < 0
        ):
            return

        self.world.obstacles[cat.x][cat.y].remove(cat)
        cat.x = end_x
        cat.y = end_y
        self.world.obstacles[end_x][end_y].append(cat)
        # endregion cat random movement