import pygame as pg
import numpy as np
import random
import itertools as it
import math
from UI.grid import Grid, Node
from Logic.Apath import a_path


class Window():
    def __init__(self, grid: Grid,start: (int,int),end: (int,int),mode: int):





        
        
        
        self.start = start
        self.end = end
        self.grid = grid

        # assign to variables for brevity
        cols = self.grid.cols
        rows = self.grid.rows
        width = Node.r_width
        height = Node.r_height
        margin = Node.r_margin


        screen_width = cols * (width + margin) + 2 * margin
        screen_height = rows * (height + margin) + 2 * margin

        self.screen = pg.display.set_mode([screen_width, screen_height])

        self.end = False

        self.clock = pg.time.Clock()
        

        def obstacles(self, grid: Grid,option: int):
            if option == 1:
                for x in range(len(grid.table)*2):
                    grid.generate_trash(random.randint(1,len(grid.table)-1),random.randint(1,len(grid.table)-1))
            elif option == 2:
                for x in range (13):
                    grid.change_field(x,14,3)
                for x in range (8):
                    grid.change_field(12,x+6,3)
                


        obstacles(self,grid,mode)
        grid.change_field(start[0], start[1], 1)
        grid.change_field(end[0], end[1], 2)

        

        #list of trash to collect
        to_collect = grid.get_trash_possition(5)
        print("to collect len: ",len(to_collect))

        #sort list of tuples to get minimum distance betwen all of them 
        #fajnie jakby sie udalo to zrobic wydajniej ale narazie niech bedzie tak 
        sorted(to_collect)

        pg.init()   # pylint: disable=no-member
        # setup window
        pg.display.set_caption('Inteligentna śmieciarka')
        
        #draw starting map
        self.grid.draw_map(self.screen)


        #move of the truck 
        def move_truck(path):
            for index, t  in enumerate(path):
                x,y =t
                if index != 0:
                    self.grid.change_field(path[index-1][0],path[index-1][1],4)
                self.grid.change_field(x, y, 1)
                self.grid.draw_node(self.screen, path[index-1][0],path[index-1][1])
                self.grid.draw_node(self.screen, x, y)
                pg.time.delay(500)
            print("collected:",grid.table[x][y].house.trash[2],"on possition: (",x,",",y,")  ", grid.table[x][y].house.trash_file)


        #visit all points from from to_collect
        
        for ind, x in enumerate(to_collect):
            #copy table
            obs = [3,8,6,7]
            if ind == 0:
                array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
                path = a_path(array,(start[0],start[1]),(x[0],x[1]),obs)
                #print("Path:",path)
            else:
                array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
                path = a_path(array,(to_collect[ind-1][0],to_collect[ind-1][1]),(x[0],x[1]),obs)
                #print("Path:",path)

    
            #draw movement of garbage truck
            move_truck(path)


        #last move
        array = [[self.grid.table[col][row] for row in range(cols)] for col in range(rows)]
        path = a_path(array,(to_collect[len(to_collect)-1][0],to_collect[len(to_collect)-1][1]),(end[0],end[1]),obs)
        #print("Path:",path)
        move_truck(path)

        pg.quit()   # pylint: disable=no-member