import pygame
from pygame.locals import *
import sys
import time
import random
# import requests
from urllib.request import urlopen
# from BeautifulSoup import BeautifulSoup4 as BS
from bs4 import BeautifulSoup as BS
from urllib.parse import urlparse, urlsplit
# import pandas as pd
# from PIL import Image


class Game:
   
    def __init__(self):
        self.w = 750
        self.h = 500
        self.reset = True
        self.active = False
        self.input_text = ""
        self.word = ""
        self.time_start = 0
        self.total_time = 0
        self.accuracy = "0%"
        self.results = "Time: 0 Accuracy: 0% WPM: 0"
        self.wpm = 0
        self.end = False
        self.HEAD_C = (255, 213, 102)
        self.TEXT_C = (240, 240, 240)
        self.RESULT_C = (255, 70, 70)
        
       
        pygame.init()
        self.open_img = pygame.image.load("type-speed-open1.png")
        self.open_img = pygame.transform.scale(self.open_img, (self.w, self.h))


        self.bg = pygame.image.load("background.jpg")
        self.bg = pygame.transform.scale(self.bg, (500, 750))

        self.screen = pygame.display.set_mode((self.w, self.h))
        pygame.display.set_caption("Type Racer")
       

    def draw_text(self, screen, msg, y ,fsize, color):
        font = pygame.font.Font(None, fsize)
        text = font.render(msg, 1,color)
        text_rect = text.get_rect(center=(int(self.w/2), int(y)))
        screen.blit(text, text_rect)
        pygame.display.update()   

    def get_sentence(self):
        # website_page = "https://genius.com/#top-songs"
        # page = urlopen(website_page)
        # soup = BS(page)
        # soup

        # title_links = soup.find_all('h3', class_="ChartSongdesktop__Lyrics-sc-18658hh-4 ksRthp")
        # print("title links" + title_links)
        # title_links

        # links = {}

        # for i in range(0, len(title_links)):


        # URL = ""
        # PARAMS = {}
        # r = requests.get(url = URL, params = PARAMS)
        # data = r.json()

        f = open("sentences1.txt").read()
        sentences = f.split(".")
        sentence = random.choice(sentences)
        return sentence

    def show_results(self, screen):
        if (not self.end):
            #Calculate time
            self.total_time = time.time() - self.time_start
               
            #Calculate accuracy
            count = 0
            for i,c in enumerate(self.word):
                try:
                    if self.input_text[i] == c:
                        count += 1
                except:
                    pass
            self.accuracy = count / len(self.word) * 100
           
            #Calculate words per minute
            self.wpm = len(self.input_text) * 60 / (5 * self.total_time)
            self.end = True
                
            self.results = "Time:"+str(round(self.total_time)) +" secs   Accuracy:"+ str(round(self.accuracy)) + "%" + "   Wpm: " + str(round(self.wpm))

            # draw icon image
            self.time_img = pygame.image.load("icon.png")
            self.time_img = pygame.transform.scale(self.time_img, (150, 150))
            screen.blit(self.time_img, (int(self.w/2-75), int(self.h - 140)))
            self.draw_text(screen, "Reset", self.h - 70, 26, (100, 100, 100))
            
            pygame.display.update()

    def run(self):
        self.reset_game()
    
       
        self.running = True
        while (self.running):
            clock = pygame.time.Clock()
            self.screen.fill((0, 0, 0), (50, 250, 650, 50))
            pygame.draw.rect(self.screen,self.HEAD_C, (50, 250, 650, 50), 2)
            # update the text of user input
            self.draw_text(self.screen, self.input_text, 274, 26, (250, 250, 250))
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == QUIT:
                    self.running = False
                    sys.exit()
                elif event.type == pygame.MOUSEBUTTONUP:
                    x, y = pygame.mouse.get_pos()
                    # position of input box
                    if (x >= 50 and x <= 650 and y >= 250 and y <= 300):
                        self.active = True
                        self.input_text = ""
                        self.time_start = time.time() 
                     # position of reset box
                    if (x >= 310 and x <= 510 and y >= 390 and self.end):
                        self.reset_game()
                        x, y = pygame.mouse.get_pos()
         
                        
                elif event.type == pygame.KEYDOWN:
                    if self.active and not self.end:
                        if event.key == pygame.K_RETURN:
                            self.show_results(self.screen)
                            self.draw_text(self.screen, self.results, 350, 28, self.RESULT_C)  
                            self.end = True
                            
                        elif event.key == pygame.K_BACKSPACE:
                            self.input_text = self.input_text[:-1]
                        else:
                            try:
                                self.input_text += event.unicode
                            except:
                                pass
            
            pygame.display.update()
             
                
        clock.tick(60)

    def reset_game(self):
        self.screen.blit(self.open_img, (0,0))

        pygame.display.update()
        time.sleep(1)
        
        self.reset = False
        self.end = False

        self.input_text = ""
        self.word = ""
        self.time_start = 0
        self.total_time = 0
        self.wpm = 0

        # Get random sentence 
        self.word = self.get_sentence()
        if (not self.word): self.reset_game()
        #drawing heading
        self.screen.fill((0, 0, 0))
        self.screen.blit(self.bg, (0, 0))
        msg = "Type Racer"
        self.draw_text(self.screen, msg, 80, 80, self.HEAD_C)  
        # draw the rectangle for input box
        pygame.draw.rect(self.screen, (255, 192, 25), (50, 250, 650, 50), 2)

        # draw the sentence string
        self.draw_text(self.screen, self.word, 200, 28, self.TEXT_C)
        
        pygame.display.update()



Game().run()

