import pygame
from item import Item

class Loja:
    def __init__(self, window, player):
        self.window = window
        self.assets = {
            "fonte":  pygame.font.Font("assets/batalha/fonte/fonte.ttf", 40),
            'fonte_preco' : pygame.font.Font("assets/batalha/fonte/fonte.ttf", 35),

            'caixa_quantidade' : pygame.transform.scale(pygame.image.load('assets/loja/caixa_quantidade.png'), (300, 138)),
            'caixa_loja' : pygame.transform.scale(pygame.image.load('assets/loja/caixa_loja.png'), (225, 65)),
            'caixa_dinheiro' : pygame.transform.scale(pygame.image.load('assets/loja/caixa_dinheiro.png'), (200, 100)),
            'caixa_inbag' : pygame.transform.scale(pygame.image.load('assets/loja/caixa_inbag.png'), (224, 64)),
            'info_item' : pygame.transform.scale(pygame.image.load('assets/loja/info_item.png'), (720, 144)),
            'seta_baixo_loja' : pygame.image.load('assets/loja/seta_baixo_loja.png'),
            'seta_cima_loja' : pygame.image.load('assets/loja/seta_cima_loja.png'),
            'seta' : pygame.transform.scale(pygame.image.load('assets/loja/seta_loja.png'), (12, 20)),
            'sair' : pygame.transform.scale(pygame.image.load('assets/loja/sair.png'), (60, 66)),
            'menu_loja' : pygame.transform.scale(pygame.image.load('assets/loja/menu_loja.png'), (318, 218)),

            'potion' : pygame.transform.scale(pygame.image.load('assets/loja/potion.png'), (60, 66)),
            'super_potion' : pygame.transform.scale(pygame.image.load('assets/loja/super_potion.png'), (60, 66)),
            'hyper_potion' : pygame.transform.scale(pygame.image.load('assets/loja/hyper_potion.png'), (60, 66)),
            'max_potion' : pygame.transform.scale(pygame.image.load('assets/loja/max_potion.png'), (60, 66)),
            'full_potion' : pygame.transform.scale(pygame.image.load('assets/loja/full_restore.png'), (60, 66)),
            'antidoto' : pygame.transform.scale(pygame.image.load('assets/loja/antidoto.png'), (60, 66)),
            'burn_heal' : pygame.transform.scale(pygame.image.load('assets/loja/burn_heal.png'), (60, 66)),
            'paralyze_heal' : pygame.transform.scale(pygame.image.load('assets/loja/paralyze_heal.png'), (60, 66)),
            'full_heal' : pygame.transform.scale(pygame.image.load('assets/loja/full_heal.png'), (60, 66)),
            'revive' : pygame.transform.scale(pygame.image.load('assets/loja/revive.png'), (60, 66)),
            'max_revive' : pygame.transform.scale(pygame.image.load('assets/loja/max_revive.png'), (60, 66)),

            'blip' : pygame.mixer.Sound('assets/sound/effect/blip.mp3'),
        
        }

        self.state = {
            'caixa_quantidade' : False,
            'seta' : 0,
            'i' : 0,
            'quantidade' : 1,
            'player' : player,
        }

        self.pos = [
            (305, 144), #0
            (305, 175), #1
            (305, 206), #2
            (305, 238), #3
            (305, 270), #4
            (305, 300), #5
        ]

        self.linhas = [
            (325, 133), #0
            (325, 166), #1
            (325, 197), #2
            (325, 230), #3
            (325, 262), #4
            (325, 293), #5
        ]

        self.produtos = [
            ['POTION', self.assets['potion'], ['A spray-type wound medicine.', 'It restores the HP of one', 'Pokémon by 20 points.'], 300] , #0
            ['SUPER POTION', self.assets['super_potion'], ['A spray-type wound medicine.',  'It restores the HP of one', 'Pokémon by 50 points.'], 700], #1
            ['HYPER POTION', self.assets['hyper_potion'], ['A spray-type wound medicine.', 'It restores the HP of one', 'Pokémon by 200 points.'], 1500], #2
            ['MAX POTION', self.assets['max_potion'], ['A spray-type wound medicine.', 'It fully restores the HP of one', 'Pokémon.'], 2500], #3
            ['ANTIDOTE', self.assets['antidoto'], ['A spray-type medicine. It', 'heals one Pokémon from a', 'poisoning.'], 100], #4
            ['BURN HEAL', self.assets['burn_heal'], ['A spray-type medicine. It', 'heals one Pokémon of a', 'burn.'], 250], #5
            ['PARALYZ HEAL', self.assets['paralyze_heal'], ['A spray-type medicine. It', 'heals one Pokémon from', 'paralysis.'], 200], #6
            ['FULL HEAL', self.assets['full_heal'], ['A spray-type medicine. It', 'heals all the status problems', 'of one Pokémon.'], 600], #7
            ['FULL RESTORE', self.assets['full_potion'], ['A medicine that fully restores', 'the HP and heals any status', 'problems of one Pokémon.'], 3000], #8
            ['REVIVE', self.assets['revive'], ['A medicine that revives a', 'fainted Pokémon, restoring HP', 'by half the maximum amount.'], 1500], #9
            ['MAX REVIVE', self.assets['max_revive'], ['A medicine that revives a', 'fainted Pokémon, restoring HP', 'fully.'], 4000], #10
            ['CANCEL', self.assets['sair'], ['Quit shopping.'], None], #11
        ]


    def draw(self):

        x = 285
        y = 122

        self.window.blit(self.assets['menu_loja'], (x, y))



        self.window.blit(self.assets['info_item'], (0, self.window.get_height() - self.assets['info_item'].get_height()))

        item = self.state['seta'] + self.state['i']
        self.window.blit(self.produtos[item][1], (33, 570))
        
        add = 550
        for linha in self.produtos[item][2]:
            self.window.blit(pygame.font.Font.render(self.assets['fonte'], linha, True, (255, 255, 255)), (130, add))
            add += 30

        
        self.window.blit(self.assets['caixa_dinheiro'], (x - self.assets['caixa_dinheiro'].get_width() - 10, y))
        self.window.blit(pygame.font.Font.render(self.assets['fonte'], 'MONEY', True, (46, 46, 46)), (90, 133))
        dinheiro = pygame.font.Font.render(self.assets['fonte'], '$' + str(self.state['player'].money), True, (46, 46, 46))
        self.window.blit(dinheiro, (262 - dinheiro.get_width(), 180))

        
        if self.state['caixa_quantidade']:
            armazem = 0
            for item in self.state['player'].bag:
                if item.nome == self.produtos[self.state['i'] + self.state['seta']][0]:
                    armazem += 1
            self.window.blit(self.assets['caixa_inbag'], (x - self.assets['caixa_inbag'].get_width() - 10, y + self.assets['menu_loja'].get_height() - self.assets['caixa_inbag'].get_height()))
            self.window.blit(pygame.font.Font.render(self.assets['fonte'], f'IN BAG: {armazem}', True, (46, 46, 46)), (70, 289))
        
        if self.state['caixa_quantidade']:
            self.window.blit(self.assets['caixa_quantidade'], (x + self.assets['menu_loja'].get_width() - self.assets['caixa_quantidade'].get_width(), y + self.assets['menu_loja'].get_height() + 20))
            self.window.blit(pygame.font.Font.render(self.assets['fonte'], 'X' + str(self.state['quantidade']), True, (46, 46, 46)), (345, 408))
            total = pygame.font.Font.render(self.assets['fonte'], '$' + str(self.produtos[self.state['selecionado']][3] * self.state['quantidade']), True, (46, 46, 46))
            self.window.blit(total, (572 - total.get_width(), 408))

        self.window.blit(self.assets['seta'], self.pos[self.state['seta']])

        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']][0], True, (46, 46, 46)), self.linhas[0])
        preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i']][3]), True, (46, 46, 46))
        self.window.blit(preco, (575 - preco.get_width(), self.linhas[0][1] + 3))

        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']+1][0], True, (46, 46, 46)), self.linhas[1])
        preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i'] + 1][3]), True, (46, 46, 46))
        self.window.blit(preco, (575 - preco.get_width(), self.linhas[1][1] + 3))

        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']+2][0], True, (46, 46, 46)), self.linhas[2])
        preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i'] + 2][3]), True, (46, 46, 46))
        self.window.blit(preco, (575 - preco.get_width(), self.linhas[2][1] + 3))

        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']+3][0], True, (46, 46, 46)), self.linhas[3])
        preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i'] + 3][3]), True, (46, 46, 46))
        self.window.blit(preco, (575 - preco.get_width(), self.linhas[3][1] + 3))
        
        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']+4][0], True, (46, 46, 46)), self.linhas[4])
        preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i'] + 4][3]), True, (46, 46, 46))
        self.window.blit(preco, (575 - preco.get_width(), self.linhas[4][1] + 3))

        self.window.blit(pygame.font.Font.render(self.assets['fonte'], self.produtos[self.state['i']+5][0], True, (46, 46, 46)), self.linhas[5])
        if self.state['i'] < 6:
            preco = pygame.font.Font.render(self.assets['fonte_preco'], '$' + str(self.produtos[self.state['i'] + 5][3]), True, (46, 46, 46))
            self.window.blit(preco, (575 - preco.get_width(), self.linhas[5][1] + 3))  



        pygame.display.update()
        


    def update(self):
        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                return 'sair'
            if evento.type == pygame.KEYDOWN and (evento.key == pygame.K_DOWN or evento.key == pygame.K_s) and self.state['i'] < 7 and not self.state['caixa_quantidade']:
                if self.state['seta'] == 5 and self.state['i'] < 6:
                    self.state['i'] += 1
                    self.assets['blip'].play()
                elif self.state['seta'] < 5:
                    self.state['seta'] += 1
                    self.assets['blip'].play()
            if evento.type == pygame.KEYDOWN and (evento.key == pygame.K_UP or evento.key == pygame.K_w) and not self.state['caixa_quantidade']:
                if self.state['seta'] == 0 and self.state['i'] > 0:
                    self.state['i'] -= 1
                    self.assets['blip'].play()
                elif self.state['seta'] > 0:
                    self.state['seta'] -= 1
                    self.assets['blip'].play()
            if evento.type == pygame.KEYDOWN and evento.key == pygame.K_ESCAPE:
                if self.state['caixa_quantidade']:
                    self.state['caixa_quantidade'] = False
                    self.state['quantidade'] = 1
                else:
                    return 'volta'
            
            if evento.type == pygame.KEYDOWN and (evento.key == pygame.K_DOWN or evento.key == pygame.K_s) and self.state['caixa_quantidade'] and self.state['quantidade'] > 1:
                self.state['quantidade'] -= 1
            if evento.type == pygame.KEYDOWN and (evento.key == pygame.K_UP or evento.key == pygame.K_w) and self.state['caixa_quantidade']:
                self.state['quantidade'] += 1
                if (self.produtos[self.state['selecionado']][3] * self.state['quantidade']) > self.state['player'].money:
                    self.state['quantidade'] -= 1

            if evento.type == pygame.KEYDOWN and evento.key == pygame.K_SPACE:
                if self.state['caixa_quantidade']:
                    for i in range(self.state['quantidade']):
                        add = Item(self.produtos[self.state['selecionado']][0])
                        self.state['player'].bag.append(add)
                    self.state['player'].money -= (self.produtos[self.state['selecionado']][3] * self.state['quantidade'])
                    self.state['caixa_quantidade'] = False
                    self.state['quantidade'] = 1
                elif self.state['i'] + self.state['seta'] == 11:
                    return 'volta'
                elif self.produtos[self.state['i'] + self.state['seta']][3] <= self.state['player'].money:
                    self.state['selecionado'] = self.state['i'] + self.state['seta']
                    self.state['caixa_quantidade'] = True
        
        return True