#!/usr/bin/env python3
# -*- coding: utf-8 -*- #

import pygame, random, os
from support import operations

class Avocado:

    def __init__(self, screen, boundaries, properties, target, level, filename=os.path.join('img', 'AvoCado_0_PINK.png')):

        # Set up our instance variables
        self.screen = screen
        self.screen_width, self.screen_height = screen.get_size()
        self.avocados = {(255,0,0): os.path.join('img', 'AvoCado_0_RED.png'), \
                         (0,255,0): os.path.join('img', 'AvoCado_0_GREEN.png'), \
                         (0,0,255): os.path.join('img', 'AvoCado_0_BLUE.png'), \
                         (255,255,0): os.path.join('img', 'AvoCado_0_YELLOW.png'), \
                         (255,192,203): os.path.join('img', 'AvoCado_0_PINK.png')}
        self.color = properties['color']
        self.w, self.y = properties['size']
        self.filename = self.avocados[self.color]
        self.target = target
        self.boundaries = boundaries
        self.checkObstacle = True

        # Initialize the image
        self.i = pygame.image.load(filename).convert_alpha()
        self.i = pygame.image.load(self.filename)
        self.image = pygame.transform.scale(self.i, (self.w, self.y))
        self.rect = self.image.get_rect()

        # Set the avocado's initial position and velocity
        self.init_pos()
        self.vx = 2
        self.vy = 4 * (level * 0.5)

        # Avocado state
        self.is_still_falling = True
        self.has_been_pinned = False

        # Avocado sounds
        self.click = self.loadClick()
        self.clickFail = self.loadFailClick()


    def setTargetColor(self, targetColor):
        self.target = targetColor


    def blitme(self):
        self.screen.blit(self.image, self.rect)


    def init_pos(self):
        self.rect.x = random.randint(0, self.screen_width)
        self.rect.y = random.randint(20, 70)


    def isHit(self, click):
        """
        Checks whether this object collides with the given position
        of a mouse-click. Return true is the correct color was hit and
        false if it was the wrong one.
        Just returns void if no avocado was hit
        """
        mousex, mousey = click
        if self.rect.left < mousex and self.rect.right > mousex and \
            self.rect.top < mousey and self.rect.bottom > mousey:

            if self.color == self.target:
                self.has_been_pinned = True
                self.is_still_falling = False
                self.click.play()
                return True, self.rect.center
            else:
                self.clickFail.play()
                return False, (0, 0)
        return None, (0, 0)
        # BUG - isHit is called 4 times upon click which makes it return the
        # first time but fail the consecutive times
        #else:
        #    self.clickFail.play()


    def isFalling(self):
        return self.is_still_falling


    def isPinned(self):
        return self.has_been_pinned


    def checkBoundaries(self):
        # Checking screen boundaries
        if self.rect.right > self.screen_width or self.rect.left < 0:
            self.checkObstacle = True
            self.vx = -self.vx

        # Checking for obstacle collisions
        for obstacle in self.boundaries:
            left, top, width, height = obstacle
            right = left + width
            bottom = top + height

            if self.checkObstacle \
             and (self.rect.right < right and self.rect.left > left):
                self.checkObstacle = False
                # print(self.rect.bottom, top)
                # if self.rect.bottom > top:
                #     self.vy = -self.vy

            if self.checkObstacle \
             and ((self.rect.right > right and self.rect.left < right) \
             or (self.rect.left < left and self.rect.right > left)):
                if self.rect.bottom > top:
                    self.vx = -self.vx


    def move(self):
        if not self.has_been_pinned:
            self.checkBoundaries()

            if self.hasLanded():
                self.destroy()

            # Ah, weird…
            # self.image = pygame.transform.rotate(self.image, 1)
            self.rect.x += self.vx
            self.rect.y += self.vy
        return True


    def hasLanded(self):
        if self.rect.top > self.screen_height:
            self.is_still_falling = False
            print('DEBUG :: splatch!')
            return True


    def loadClick(self, sound=True):
        if not sound:
            return
        return pygame.mixer.Sound("audio/click.wav")


    def loadFailClick(self, sound=True):
        if not sound:
            return
        return pygame.mixer.Sound("audio/poop.wav")


    def destroy(self):
        del(self)
