import pygame
import sys

# 初始化Pygame
pygame.init()

# 窗口设置
WINDOW_WIDTH = 500
WINDOW_HEIGHT = 400
BACKGROUND_COLOR = (30, 30, 40)
TEXT_COLOR = (255, 255, 255)
INPUT_BOX_COLOR = (50, 50, 60)
INPUT_BOX_ACTIVE_COLOR = (100, 100, 120)
BUTTON_COLOR = (70, 130, 180)
BUTTON_HOVER_COLOR = (100, 150, 200)
RESULT_BG_COLOR = (40, 40, 50)

# 字体设置
FONT = pygame.font.Font(None, 36)
SMALL_FONT = pygame.font.Font(None, 28)

# 温度转换函数


def celsius_to_fahrenheit(c):
    return c * 9.0/5.0 + 32


def celsius_to_kelvin(c):
    return c + 273.15


def fahrenheit_to_celsius(f):
    return (f - 32) * 5.0/9.0


def fahrenheit_to_kelvin(f):
    return (f - 32) * 5.0/9.0 + 273.15


def kelvin_to_celsius(k):
    return k - 273.15


def kelvin_to_fahrenheit(k):
    return (k - 273.15) * 9.0/5.0 + 32


class TemperatureConverter:
    def __init__(self):
        self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
        pygame.display.set_caption("单位温度转换器")
        self.clock = pygame.time.Clock()
        self.running = True

        # 输入框属性
        self.input_text = ""
        self.input_active = True
        self.input_rect = pygame.Rect(150, 80, 200, 40)

        # 单位选择
        self.from_unit = "Celsius"
        self.to_unit = "Fahrenheit"
        self.units = ["Celsius", "Fahrenheit", "Kelvin"]

        # 按钮矩形
        self.from_buttons = []
        self.to_buttons = []
        self.create_unit_buttons()

        # 转换按钮
        self.convert_button = pygame.Rect(150, 280, 200, 50)

        # 转换结果
        self.result = None
        self.error_message = None

    def create_unit_buttons(self):
        """创建单位选择按钮"""
        # 输入单位按钮（左侧列）
        from_y = 160
        for i, unit in enumerate(self.units):
            rect = pygame.Rect(80, from_y + i * 50, 140, 40)
            self.from_buttons.append((rect, unit))

        # 输出单位按钮（右侧列）
        to_y = 160
        for i, unit in enumerate(self.units):
            rect = pygame.Rect(280, to_y + i * 50, 140, 40)
            self.to_buttons.append((rect, unit))

    def handle_events(self):
        """处理事件"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False

            elif event.type == pygame.MOUSEBUTTONDOWN:
                # 检查输入框点击
                if self.input_rect.collidepoint(event.pos):
                    self.input_active = True
                else:
                    self.input_active = False

                # 检查输入单位按钮
                for rect, unit in self.from_buttons:
                    if rect.collidepoint(event.pos):
                        self.from_unit = unit
                        self.error_message = None  # 切换单位时清除错误
                        self.result = None

                # 检查输出单位按钮
                for rect, unit in self.to_buttons:
                    if rect.collidepoint(event.pos):
                        self.to_unit = unit
                        self.error_message = None
                        self.result = None

                # 检查转换按钮
                if self.convert_button.collidepoint(event.pos):
                    self.convert_temperature()

            elif event.type == pygame.KEYDOWN and self.input_active:
                if event.key == pygame.K_RETURN:
                    self.convert_temperature()
                elif event.key == pygame.K_BACKSPACE:
                    self.input_text = self.input_text[:-1]
                else:
                    # 允许输入数字、负号和小数点
                    if event.unicode.isdigit() or event.unicode == '.' or (event.unicode == '-' and len(self.input_text) == 0):
                        self.input_text += event.unicode
                    # 可选：限制小数点个数
                    if self.input_text.count('.') > 1:
                        self.input_text = self.input_text[:-1]

    def convert_temperature(self):
        """执行温度转换"""
        self.error_message = None
        self.result = None

        if not self.input_text:
            self.error_message = "请输入温度值"
            return

        try:
            value = float(self.input_text)
        except ValueError:
            self.error_message = "无效的数字格式"
            return

        # 执行转换
        try:
            # 先转换为摄氏度（作为中间单位）
            if self.from_unit == "Celsius":
                celsius = value
            elif self.from_unit == "Fahrenheit":
                celsius = fahrenheit_to_celsius(value)
            elif self.from_unit == "Kelvin":
                if value < 0:
                    self.error_message = "开尔文温度不能为负数"
                    return
                celsius = kelvin_to_celsius(value)
            else:
                self.error_message = "未知的输入单位"
                return

            # 再从摄氏度转换为目标单位
            if self.to_unit == "Celsius":
                result_value = celsius
            elif self.to_unit == "Fahrenheit":
                result_value = celsius_to_fahrenheit(celsius)
            elif self.to_unit == "Kelvin":
                result_value = celsius_to_kelvin(celsius)
                if result_value < 0:
                    self.error_message = "转换结果开尔文温度为负，物理上不可能"
                    return
            else:
                self.error_message = "未知的输出单位"
                return

            # 格式化结果（保留两位小数，如果小数部分为0则显示整数）
            if result_value.is_integer():
                self.result = f"{int(result_value)}"
            else:
                self.result = f"{result_value:.2f}"

        except Exception as e:
            self.error_message = f"转换错误: {str(e)}"

    def draw(self):
        """绘制界面"""
        self.screen.fill(BACKGROUND_COLOR)

        # 绘制标题
        title_text = FONT.render("温度转换器", True, TEXT_COLOR)
        title_rect = title_text.get_rect(center=(WINDOW_WIDTH // 2, 30))
        self.screen.blit(title_text, title_rect)

        # 绘制输入框
        color = INPUT_BOX_ACTIVE_COLOR if self.input_active else INPUT_BOX_COLOR
        pygame.draw.rect(self.screen, color, self.input_rect, border_radius=5)
        pygame.draw.rect(self.screen, TEXT_COLOR,
                         self.input_rect, 2, border_radius=5)

        # 绘制输入框标签
        label_text = SMALL_FONT.render("输入温度:", True, TEXT_COLOR)
        self.screen.blit(label_text, (self.input_rect.x -
                         100, self.input_rect.y + 10))

        # 绘制输入文本
        input_surface = FONT.render(self.input_text, True, TEXT_COLOR)
        self.screen.blit(
            input_surface, (self.input_rect.x + 10, self.input_rect.y + 8))

        # 绘制单位选择标题
        from_title = SMALL_FONT.render("从:", True, TEXT_COLOR)
        to_title = SMALL_FONT.render("到:", True, TEXT_COLOR)
        self.screen.blit(from_title, (130, 140))
        self.screen.blit(to_title, (330, 140))

        # 绘制输入单位按钮
        for rect, unit in self.from_buttons:
            if unit == self.from_unit:
                color = BUTTON_HOVER_COLOR
            else:
                color = BUTTON_COLOR
            pygame.draw.rect(self.screen, color, rect, border_radius=5)
            pygame.draw.rect(self.screen, TEXT_COLOR, rect, 2, border_radius=5)
            text = SMALL_FONT.render(unit, True, TEXT_COLOR)
            text_rect = text.get_rect(center=rect.center)
            self.screen.blit(text, text_rect)

        # 绘制输出单位按钮
        for rect, unit in self.to_buttons:
            if unit == self.to_unit:
                color = BUTTON_HOVER_COLOR
            else:
                color = BUTTON_COLOR
            pygame.draw.rect(self.screen, color, rect, border_radius=5)
            pygame.draw.rect(self.screen, TEXT_COLOR, rect, 2, border_radius=5)
            text = SMALL_FONT.render(unit, True, TEXT_COLOR)
            text_rect = text.get_rect(center=rect.center)
            self.screen.blit(text, text_rect)

        # 绘制转换按钮
        mouse_pos = pygame.mouse.get_pos()
        if self.convert_button.collidepoint(mouse_pos):
            color = BUTTON_HOVER_COLOR
        else:
            color = BUTTON_COLOR
        pygame.draw.rect(self.screen, color,
                         self.convert_button, border_radius=10)
        pygame.draw.rect(self.screen, TEXT_COLOR,
                         self.convert_button, 2, border_radius=10)
        convert_text = FONT.render("转换", True, TEXT_COLOR)
        convert_rect = convert_text.get_rect(center=self.convert_button.center)
        self.screen.blit(convert_text, convert_rect)

        # 显示结果
        if self.result is not None:
            result_text = FONT.render(
                f"结果: {self.result} °{self.to_unit[0]}", True, TEXT_COLOR)
            result_bg = pygame.Rect(100, 340, 300, 40)
            pygame.draw.rect(self.screen, RESULT_BG_COLOR,
                             result_bg, border_radius=5)
            self.screen.blit(result_text, (150, 348))
        elif self.error_message is not None:
            error_text = SMALL_FONT.render(
                self.error_message, True, (255, 100, 100))
            error_rect = error_text.get_rect(center=(WINDOW_WIDTH // 2, 365))
            self.screen.blit(error_text, error_rect)

        pygame.display.flip()

    def run(self):
        """主循环"""
        while self.running:
            self.handle_events()
            self.draw()
            self.clock.tick(60)

        pygame.quit()
        sys.exit()


if __name__ == "__main__":
    converter = TemperatureConverter()
    converter.run()
