class Play():
    def __init__(self, media):
        self.start_time = time.time()
        self.star_list = []  # 降ってくる星用のリスト
        self.get_star = 0  # 取得した星の数
        self.titlefont = pygame.font.SysFont('inkfree', 80)
        self.comment = pygame.font.SysFont('inkfree', 40)
        self.title = self.titlefont.render("Play", True, (255, 255, 255))
        self.result = self.titlefont.render("Result", True, (255, 255, 255))
        self.control = Control()
        self.media = media
        self.ranking = Ranking(media)
        self.read_ranking = False  # ランキングを読み込んだかどうか
        self.write_point = False  # ランキングに書き込めるかどうか
        self.eng_chara = [[
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            ' '
        ],
                          [
                              'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
                              'x', 'y', 'z', 'Back'
                          ]]
        self.choose = [0, 0]
        self.your_name = ''

    def main(self, screen, difficulty, rect_player):
        # タイトルと設定情報の描画
        star_num = self.titlefont.render("Star:{0}".format(self.get_star),
                                         True, (255, 255, 255))
        lim_time = LIMIT_TIME - int((time.time() - self.start_time))
        time_num = self.titlefont.render("Time:{0}".format(lim_time), True,
                                         (255, 255, 255))
        screen.blit(self.title, (20, 50))

        # 終了条件を満たしていたら
        if lim_time <= 0:
            screen.blit(self.result, (500, 50))
            screen.blit(star_num, (500, 150))
            # ランキング情報を1度だけ読み出し順位を確認する
            if self.read_ranking == False:
                self.write_point = self.ranking.read_ranking(self.get_star)
                self.read_ranking = True

            # ランキングで更新があったら名前を入力させる
            if self.write_point:
                screen.blit(
                    self.titlefont.render("New Record!", True,
                                          (255, 255, 255)), (430, 250))
                # スクリーンキーボードを表示する
                for i, eng in enumerate(self.eng_chara):
                    for j, chara in enumerate(eng):
                        screen.blit(
                            self.comment.render(chara, True, (255, 255, 255)),
                            (350 + j * 40, 400 + i * 40))
                screen.blit(self.comment.render("END", True, (255, 255, 255)),
                            (350 + 220, 400 + 2 * 40))
                screen.blit(
                    self.comment.render(self.your_name, True, (255, 255, 255)),
                    (350, 350))  # 名前を表示
                # 今自分が選択している位置を四角形で表示
                pygame.draw.rect(
                    screen, (255, 255, 0),
                    Rect(350 + 40 * self.choose[X], 410 + 40 * self.choose[Y],
                         30, 30), 2)
                self.input_name()
            else:
                screen.blit(
                    self.titlefont.render("press enter!", True,
                                          (255, 255, 255)), (430, 250))
                # エンターを押したら終了するための処理
                con = self.control.control()
                if con == 'return':
                    rect_player.center = (450, 220)
                    self.media.kirakira.play()
                    self.media.play_bgm(1)
                    return Mode.MENU
        # まだ終了していなかったら(制限時間内なら)
        else:
            screen.blit(time_num, (900, 10))
            screen.blit(star_num, (900, 100))
            ran = random.randint(0, 100)
            # 生成した乱数が難易度の一定数以内なら星を生成する
            if ran <= (difficulty[Difficulty.STAR] - 1):
                self.star_list.append(Star(random.randint(100, 1100), 50))
            # 生成された星を描画する
            for i, star in enumerate(self.star_list):
                screen.blit(self.media.star, (star.x, star.y))
                star.y += 2  # 星を落とす
                # もしキャラクターと星が重なっていたら星を取得
                if star.hit(rect_player, 15 * difficulty[Difficulty.SIZE]):
                    self.star_list.pop(i)
                    self.get_star += 1
                    self.media.hit.play()
                # 地面以下なら星を消滅
                elif self.star_list[i].y > 600:
                    self.star_list.pop(i)

            # 横移動用コントロール
            con = self.control.control2()
            if con == 'left':
                if rect_player.centerx > 100:
                    rect_player.center = (rect_player.centerx -
                                          difficulty[Difficulty.SPEED], 550)
            elif con == 'right':
                if rect_player.centerx < 1100:
                    rect_player.center = (rect_player.centerx +
                                          difficulty[Difficulty.SPEED], 550)

        return Mode.PLAY

    def input_name(self):
        # コントロール操作
        con = self.control.control()
        if con == 'up':
            if self.choose[Y] > 0:
                self.choose[Y] -= 1
        elif con == 'down':
            if self.choose[Y] < 2:
                self.choose[Y] += 1
        elif con == 'left':
            if self.choose[X] > 0:
                self.choose[X] -= 1
        elif con == 'right':
            if self.choose[X] < 13:
                self.choose[X] += 1
        elif con == 'return':
            if self.choose[Y] == 2 and self.your_name != '':  # Exitで名前有
                self.media.kirakira.play()
                # 新しいランキングを書き出す
                self.ranking.write_ranking(self.your_name)
                self.write_point = False
            elif self.choose[Y] == 2 and self.your_name == '':  # Exitで名前無
                self.media.kirakira.play()
                self.write_point = False
            else:
                # enterした場所にある文字を名前として保存する
                for i in range(14):
                    for j in range(2):
                        if self.choose[Y] == j and self.choose[X] == i:
                            if self.choose[X] == 13 and self.choose[Y] == 1:
                                self.your_name = self.your_name[0:-1]
                            else:
                                self.your_name += self.eng_chara[j][i]
        # 一番下ならENDにする
        if self.choose[Y] == 2:
            self.choose[X] = 6