import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext

# List to store conversion history
history = []

# Create main application window
root = tk.Tk()
root.title("Temperature Converter with History")
root.geometry("600x500")

# Function to show absolute zero info
def show_absolute_zero():
    info = (
        "Absolute Zero is the lowest possible temperature:\n"
        "  Celsius: -273.15°C\n"
        "  Fahrenheit: -459.67°F\n"
        "  Kelvin: 0 K\n"
        "Particles have minimal thermal motion at this temperature."
    )
    messagebox.showinfo("Absolute Zero", info)

# Helper function to get float input with validation
def get_float(entry):
    try:
        value = float(entry.get())
        return value
    except ValueError:
        messagebox.showerror("Invalid Input", "Please enter a valid numeric value.")
        return None

# Function to perform Celsius to Kelvin & Fahrenheit
def celsius_to_kelvin_f():
    c = get_float(celsius_entry)
    if c is None:
        return
    if c < -273.15:
        messagebox.showerror("Error", "Temperature below absolute zero.")
        return
    k = c + 273.15
    f = (c * 9/5) + 32
    result_text = f"C: {c:.2f}°C\nK: {k:.2f} K\nF: {f:.2f}°F"
    output_var.set(result_text)
    # Save to history
    history.append(("C to K/F", f"C: {c}", f"K: {k}, F: {f}"))

# Function to perform Kelvin to Celsius & Fahrenheit
def kelvin_to_c_f():
    k = get_float(kelvin_entry)
    if k is None:
        return
    if k < 0:
        messagebox.showerror("Error", "Kelvin cannot be negative.")
        return
    c = k - 273.15
    f = (c * 9/5) + 32
    result_text = f"K: {k:.2f} K\nC: {c:.2f}°C\nF: {f:.2f}°F"
    output_var.set(result_text)
    # Save to history
    history.append(("K to C/F", f"K: {k}", f"C: {c}, F: {f}"))

# Function to perform Fahrenheit to Celsius & Kelvin
def fahrenheit_to_c_k():
    f = get_float(fahrenheit_entry)
    c = (f - 32) * 5/9
    if c < -273.15:
        messagebox.showerror("Error", "Result below absolute zero!")
        return
    k = c + 273.15
    result_text = f"F: {f:.2f}°F\nC: {c:.2f}°C\nK: {k:.2f} K"
    output_var.set(result_text)
    # Save to history
    history.append(("F to C/K", f"F: {f}", f"C: {c}, K: {k}"))

# Function to perform Celsius to Fahrenheit
def celsius_to_fahrenheit():
    c = get_float(celsius_entry)
    if c is None:
        return
    if c < -273.15:
        messagebox.showerror("Error", "Temperature below absolute zero.")
        return
    f = (c * 9/5) + 32
    result_text = f"C: {c:.2f}°C\nF: {f:.2f}°F"
    output_var.set(result_text)
    # Save to history
    history.append(("C to F", f"C: {c}", f"F: {f}"))

# Function to perform Fahrenheit to Celsius
def fahrenheit_to_c():
    f = get_float(fahrenheit_entry)
    c = (f - 32) * 5/9
    if c < -273.15:
        messagebox.showerror("Error", "Result below absolute zero.")
        return
    result_text = f"F: {f:.2f}°F\nC: {c:.2f}°C"
    output_var.set(result_text)
    # Save to history
    history.append(("F to C", f"F: {f}", f"C: {c}"))

# Function for 'Convert Any' option
def convert_any():
    choice = conversion_choice.get()
    if choice == 'C':
        c = get_float(celsius_entry)
        if c is None:
            return
        if c < -273.15:
            messagebox.showerror("Error", "Below absolute zero.")
            return
        f = (c * 9/5) + 32
        k = c + 273.15
        result_text = f"C: {c:.2f}°C\nF: {f:.2f}°F\nK: {k:.2f}K"
        output_var.set(result_text)
        history.append(("Any Input", f"C: {c}", f"F: {f}, K: {k}"))
    elif choice == 'F':
        f = get_float(fahrenheit_entry)
        c = (f - 32) * 5/9
        if c < -273.15:
            messagebox.showerror("Error", "Result below absolute zero.")
            return
        k = c + 273.15
        result_text = f"F: {f:.2f}°F\nC: {c:.2f}°C\nK: {k:.2f}K"
        output_var.set(result_text)
        history.append(("Any Input", f"F: {f}", f"C: {c}, K: {k}"))
    elif choice == 'K':
        k = get_float(kelvin_entry)
        if k < 0:
            messagebox.showerror("Error", "Kelvin cannot be negative.")
            return
        c = k - 273.15
        f = (c * 9/5) + 32
        result_text = f"K: {k:.2f}K\nC: {c:.2f}°C\nF: {f:.2f}°F"
        output_var.set(result_text)
        history.append(("Any Input", f"K: {k}", f"C: {c}, F: {f}"))

# Function to show conversion history
def show_history():
    top = tk.Toplevel(root)
    top.title("Conversion History")
    text_area = scrolledtext.ScrolledText(top, width=70, height=20)
    text_area.pack(fill=tk.BOTH, expand=True)
    if not history:
        text_area.insert(tk.END, "No conversions yet.")
    else:
        for i, record in enumerate(history, 1):
            text_area.insert(tk.END, f"{i}. {record[0]} -> {record[1]} | {record[2]}\n")
    text_area.config(state='disabled')

# GUI Layout
# Frames for inputs
input_frame = ttk.Frame(root, padding="10")
input_frame.pack(fill=tk.X)

# Celsius Input
ttk.Label(input_frame, text="Celsius:").grid(row=0, column=0, sticky=tk.W)
celsius_entry = ttk.Entry(input_frame, width=15)
celsius_entry.grid(row=0, column=1, padx=5)

# Fahrenheit Input
ttk.Label(input_frame, text="Fahrenheit:").grid(row=1, column=0, sticky=tk.W)
fahrenheit_entry = ttk.Entry(input_frame, width=15)
fahrenheit_entry.grid(row=1, column=1, padx=5)

# Kelvin Input
ttk.Label(input_frame, text="Kelvin:").grid(row=2, column=0, sticky=tk.W)
kelvin_entry = ttk.Entry(input_frame, width=15)
kelvin_entry.grid(row=2, column=1, padx=5)

# Conversion choice for 'Convert Any'
conversion_choice = tk.StringVar(value='C')
ttk.Label(input_frame, text="Convert from:").grid(row=3, column=0, sticky=tk.W)
ttk.Radiobutton(input_frame, text='Celsius', variable=conversion_choice, value='C').grid(row=3, column=1, sticky=tk.W)
ttk.Radiobutton(input_frame, text='Fahrenheit', variable=conversion_choice, value='F').grid(row=3, column=2, sticky=tk.W)
ttk.Radiobutton(input_frame, text='Kelvin', variable=conversion_choice, value='K').grid(row=3, column=3, sticky=tk.W)

# Buttons
button_frame = ttk.Frame(root, padding="10")
button_frame.pack()

ttk.Button(button_frame, text="Absolute Zero Info", command=show_absolute_zero).grid(row=0, column=0, padx=5, pady=5)
ttk.Button(button_frame, text="C to K & F", command=celsius_to_kelvin_f).grid(row=0, column=1, padx=5, pady=5)
ttk.Button(button_frame, text="K to C & F", command=kelvin_to_c_f).grid(row=0, column=2, padx=5, pady=5)
ttk.Button(button_frame, text="F to C & K", command=fahrenheit_to_c_k).grid(row=0, column=3, padx=5, pady=5)
ttk.Button(button_frame, text="C to F", command=celsius_to_fahrenheit).grid(row=1, column=0, padx=5, pady=5)
ttk.Button(button_frame, text="F to C", command=fahrenheit_to_c).grid(row=1, column=1, padx=5, pady=5)
ttk.Button(button_frame, text="Convert Any", command=convert_any).grid(row=1, column=2, padx=5, pady=5)
ttk.Button(button_frame, text="Show History", command=show_history).grid(row=1, column=3, padx=5, pady=5)

# Output display
output_var = tk.StringVar()
output_label = ttk.Label(root, textvariable=output_var, padding="10", relief=tk.SUNKEN, anchor='center')
output_label.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

# Run the application
root.mainloop()
