import tkinter as tk
from tkinter import colorchooser, filedialog, messagebox
from PIL import ImageGrab

# -----------------------------
# MAIN WINDOW
# -----------------------------
root = tk.Tk()
root.title("Advanced Drawing Canvas")
root.geometry("900x650")
root.config(bg="#f0f0f0")
# GLOBAL VARIABLES
pen_color = "black"
brush_size = 3
current_tool = "freehand"
start_x, start_y = None, None
shape_preview = None

# -----------------------------
# FUNCTIONS
# -----------------------------
def set_tool(tool):
    global current_tool
    current_tool = tool
    
def choose_color():
    global pen_color
    color = colorchooser.askcolor(title="Choose Pen Color")
    if color[1]:
        pen_color = color[1]
def change_brush_size(val):
    global brush_size
    brush_size = int(val)
    
def start_draw(event):
    global start_x, start_y
    start_x,start_y = event.x, event.y

def draw(event):
    global start_x, start_y, shape_preview
    if current_tool in ("freehand", "eraser"):
        color= "white" if current_tool == "eraser" else pen_color
        canvas.create_line(start_x,start_y,event.x,event.y, fill=color, width=brush_size, capstyle=tk.ROUND,smooth=True)
        start_x, start_y = event.x, event.y
        # For shapes (show preview while dragging)
    elif current_tool in ("line", "rectangle", "circle"):
        if shape_preview:
            canvas.delete(shape_preview)
        if current_tool == "line":
            shape_preview = canvas.create_line(start_x, start_y, event.x, event.y, fill=pen_color, width=brush_size)
        elif current_tool == "rectangle":
            shape_preview = canvas.create_rectangle(start_x, start_y, event.x, event.y, outline=pen_color, width=brush_size)
        elif current_tool == "circle":
            shape_preview = canvas.create_oval(start_x, start_y, event.x, event.y, outline=pen_color, width=brush_size)
        

def stop_draw(event):
    global shape_preview
    if current_tool in ("line", "rectangle", "circle"):
        draw(event)  # Finalize the shape
        shape_preview = None
        
def clear_canvas():
    canvas.delete("all") # Clear all drawings
    
    
def save_canvas():
    try:
        x = root.winfo_rootx()+ canvas.winfo_x()
        y = root.winfo_rooty()+ canvas.winfo_y()
        x1 = x + canvas.winfo_width()
        y1 = y + canvas.winfo_height()
        # Save the image
        file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files","*.png")])
        
        if file_path:
            ImageGrab.grab().crop((x,y,x1,y1)).save(file_path)
            messagebox.showinfo("Save Successful", f"Canvas saved as {file_path}")
    except Exception as e:
        messagebox.showerror("Save Error", str(e))
        

# UI SETUP
canvas = tk.Canvas(root, bg="white", width=850, height=500, relief="ridge", bd=2)
canvas.pack(padx=10, pady=10)

# Bind events
canvas.bind("<Button-1>", start_draw)
canvas.bind("<B1-Motion>", draw)
canvas.bind("<ButtonRelease-1>", stop_draw)

# Toolbar Frame
toolbar = tk.Frame(root, bg="#f0f0f0")
toolbar.pack(fill="x", pady=5)

# Buttons
tk.Button(toolbar, text="🎨 Color", command=choose_color, bg="#66b3ff", fg="white",width=10).pack(side="left",padx=5)
tk.Button(toolbar, text="🖋️ Freehand",command= lambda:set_tool("freehand"), bg="#cccccc",width=10).pack(side="left",padx=5)
tk.Button(toolbar, text="📏 Line", command= lambda:set_tool("line"), bg="#cccccc", width=10).pack(side="left", padx=5)
tk.Button(toolbar, text="⬛ Rectangle" , command=lambda: set_tool("rectangle"), bg="#cccccc", width=10).pack(side="left", padx=5)
tk.Button(toolbar, text="⚪ Circle" , command=lambda: set_tool("circle"), bg="#cccccc", width=10).pack(side="left", padx=5)
tk.Button(toolbar, text="🧽 Eraser" , command=lambda: set_tool("eraser"), bg="#ff6666", fg="white", width=10).pack(side="left", padx=5)
tk.Button(toolbar, text="🧹 Clear",command=clear_canvas, bg="#ff9999", width=10).pack(side="left", padx=5)
tk.Button(toolbar, text="💾 Save", command=save_canvas ,bg="#66cc66", fg="white", width=10).pack(side="left", padx=5)

# Brush size scale

size_frame = tk.Frame(root, bg="#f0f0f0")
size_frame.pack(pady=5)
tk.Label(size_frame, text="Brush Size:", bg="#f0f0f0").pack(side="left")
brush_slider = tk.Scale(size_frame, from_= 1, to=20, orient="horizontal",command=change_brush_size, length=200)
brush_slider.set(3)
brush_slider.pack(side="left", padx=10)

# RUN APPLICATION
# -----------------------------

root.mainloop()