import pygame
import sys
import math

# 初始化Pygame
pygame.init()

# 屏幕设置
WIDTH, HEIGHT = 600, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("分数化简工具")

# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
LIGHT_BLUE = (173, 216, 230)
LIGHT_GRAY = (200, 200, 200)

# 修复中文显示：使用系统中文字体
def get_chinese_font(size):
    font_names = [
        "SimHei", "Microsoft YaHei", "SimSun",
        "PingFang SC", "Heiti SC",
        "WenQuanYi Micro Hei", "Noto Sans CJK SC"
    ]
    
    for font_name in font_names:
        try:
            font = pygame.font.SysFont(font_name, size)
            test_text = font.render("测试", True, BLACK)
            if test_text.get_width() > 10:
                return font
        except:
            continue
    
    print("警告：未找到支持中文的字体，中文可能显示为方块")
    return pygame.font.Font(None, size)

# 字体设置
font_large = get_chinese_font(64)
font_medium = get_chinese_font(48)
font_small = get_chinese_font(32)

# 输入框类
class InputBox:
    def __init__(self, x, y, w, h, text=''):
        self.rect = pygame.Rect(x, y, w, h)
        self.color = BLACK
        self.text = text
        self.txt_surface = font_medium.render(text, True, self.color)
        self.active = False

    def handle_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            self.active = self.rect.collidepoint(event.pos)
            self.color = LIGHT_BLUE if self.active else BLACK
        if event.type == pygame.KEYDOWN:
            if self.active:
                if event.key == pygame.K_BACKSPACE:
                    self.text = self.text[:-1]
                elif event.unicode.isdigit():
                    self.text += event.unicode
                self.txt_surface = font_medium.render(self.text, True, self.color)

    def draw(self, screen):
        screen.blit(self.txt_surface, (self.rect.x+10, self.rect.y+5))
        pygame.draw.rect(screen, self.color, self.rect, 2)

# 按钮类
class Button:
    def __init__(self, x, y, w, h, text):
        self.rect = pygame.Rect(x, y, w, h)
        self.text = text
        self.color = LIGHT_GRAY

    def draw(self, screen):
        pygame.draw.rect(screen, self.color, self.rect)
        pygame.draw.rect(screen, BLACK, self.rect, 2)
        text_surface = font_small.render(self.text, True, BLACK)
        screen.blit(text_surface, (self.rect.x + self.rect.width//2 - text_surface.get_width()//2,
                                  self.rect.y + self.rect.height//2 - text_surface.get_height()//2))

    def is_clicked(self, pos):
        return self.rect.collidepoint(pos)

# 化简分数
def simplify_fraction(numerator, denominator):
    if denominator == 0:
        return None, None, "分母不能为0"
    
    gcd_value = math.gcd(abs(numerator), abs(denominator))
    simplified_num = numerator // gcd_value
    simplified_den = denominator // gcd_value
    
    # 确保分母为正
    if simplified_den < 0:
        simplified_num *= -1
        simplified_den *= -1
    
    return simplified_num, simplified_den, None

# 主程序
def main():
    numerator_input = InputBox(150, 120, 100, 50)
    denominator_input = InputBox(150, 220, 100, 50)
    simplify_button = Button(350, 170, 120, 50, "化简")
    
    result_num = ""
    result_den = ""
    error_message = ""
    
    while True:
        screen.fill(WHITE)
        
        # 绘制标题
        title = font_large.render("分数化简工具", True, BLACK)
        screen.blit(title, (WIDTH//2 - title.get_width()//2, 30))
        
        # 绘制分数输入区域
        numerator_input.draw(screen)
        denominator_input.draw(screen)
        
        # 绘制分数线
        pygame.draw.line(screen, BLACK, (140, 190), (260, 190), 3)
        
        # 绘制等号
        equal_sign = font_large.render("=", True, BLACK)
        screen.blit(equal_sign, (280, 160))
        
        # 绘制化简按钮
        simplify_button.draw(screen)
        
        # 绘制结果
        if result_num and result_den:
            result_num_text = font_medium.render(str(result_num), True, BLACK)
            result_den_text = font_medium.render(str(result_den), True, BLACK)
            
            screen.blit(result_num_text, (500 - result_num_text.get_width()//2, 125))
            screen.blit(result_den_text, (500 - result_den_text.get_width()//2, 225))
            pygame.draw.line(screen, BLACK, (440, 190), (560, 190), 3)
        
        # 绘制错误信息
        if error_message:
            error_text = font_small.render(error_message, True, (255, 0, 0))
            screen.blit(error_text, (WIDTH//2 - error_text.get_width()//2, 300))
        
        # 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            numerator_input.handle_event(event)
            denominator_input.handle_event(event)
            
            if event.type == pygame.MOUSEBUTTONDOWN:
                pos = pygame.mouse.get_pos()
                if simplify_button.is_clicked(pos):
                    try:
                        num = int(numerator_input.text) if numerator_input.text else 0
                        den = int(denominator_input.text) if denominator_input.text else 0
                        
                        simplified_num, simplified_den, error = simplify_fraction(num, den)
                        if error:
                            error_message = error
                            result_num = ""
                            result_den = ""
                        else:
                            result_num = simplified_num
                            result_den = simplified_den
                            error_message = ""
                    except ValueError:
                        error_message = "请输入有效的数字"
                        result_num = ""
                        result_den = ""
        
        pygame.display.flip()

if __name__ == "__main__":
    main()