#!/usr/bin/env python3
"""
HabitTracker 2026 App Icon Generator
Creates a 1024x1024 app icon with gradient background and target design
"""

from PIL import Image, ImageDraw, ImageFont, ImageFilter
import math

def create_gradient(size, colors):
    """Create a diagonal gradient"""
    img = Image.new('RGB', (size, size))
    draw = ImageDraw.Draw(img)

    for y in range(size):
        for x in range(size):
            # Diagonal gradient factor
            factor = (x + y) / (2 * size)

            # Interpolate between colors
            r = int(colors[0][0] + (colors[1][0] - colors[0][0]) * factor)
            g = int(colors[0][1] + (colors[1][1] - colors[0][1]) * factor)
            b = int(colors[0][2] + (colors[1][2] - colors[0][2]) * factor)

            draw.point((x, y), fill=(r, g, b))

    return img

def create_radial_gradient(size, center_color, edge_color):
    """Create a radial gradient from center"""
    img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    center = size // 2
    max_dist = math.sqrt(2) * center

    for y in range(size):
        for x in range(size):
            dist = math.sqrt((x - center) ** 2 + (y - center) ** 2)
            factor = min(dist / max_dist, 1.0)

            r = int(center_color[0] + (edge_color[0] - center_color[0]) * factor)
            g = int(center_color[1] + (edge_color[1] - center_color[1]) * factor)
            b = int(center_color[2] + (edge_color[2] - center_color[2]) * factor)
            a = int(center_color[3] + (edge_color[3] - center_color[3]) * factor)

            img.putpixel((x, y), (r, g, b, a))

    return img

def create_app_icon():
    size = 1024

    # Create base gradient background (purple to blue)
    # Colors: Deep purple to vibrant blue
    color1 = (88, 28, 135)    # Deep purple
    color2 = (59, 130, 246)   # Blue

    img = Image.new('RGB', (size, size))
    draw = ImageDraw.Draw(img)

    # Create mesh-like gradient
    for y in range(size):
        for x in range(size):
            # Complex gradient with slight curve
            fx = x / size
            fy = y / size

            # Add some wave effect
            wave = math.sin(fx * math.pi) * 0.1
            factor = (fx + fy + wave) / 2.1
            factor = max(0, min(1, factor))

            r = int(color1[0] + (color2[0] - color1[0]) * factor)
            g = int(color1[1] + (color2[1] - color1[1]) * factor)
            b = int(color1[2] + (color2[2] - color1[2]) * factor)

            # Add slight brightness variation for depth
            brightness = 1.0 + math.sin(fx * math.pi * 2) * 0.05
            r = min(255, int(r * brightness))
            g = min(255, int(g * brightness))
            b = min(255, int(b * brightness))

            draw.point((x, y), fill=(r, g, b))

    # Convert to RGBA for compositing
    img = img.convert('RGBA')

    # Draw target/bullseye
    center = size // 2

    # Outer glow
    glow = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    glow_draw = ImageDraw.Draw(glow)

    # White outer ring (largest)
    ring_radius = 320
    ring_width = 45
    glow_draw.ellipse(
        [center - ring_radius, center - ring_radius,
         center + ring_radius, center + ring_radius],
        fill=(255, 255, 255, 60)
    )
    glow_draw.ellipse(
        [center - ring_radius + ring_width, center - ring_radius + ring_width,
         center + ring_radius - ring_width, center + ring_radius - ring_width],
        fill=(0, 0, 0, 0)
    )

    # Apply glow
    glow_blurred = glow.filter(ImageFilter.GaussianBlur(radius=20))
    img = Image.alpha_composite(img, glow_blurred)

    # Main target drawing
    target = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    target_draw = ImageDraw.Draw(target)

    # Ring colors and sizes (from outside to inside)
    rings = [
        (280, (255, 255, 255, 255)),   # White outer ring
        (235, (239, 68, 68, 255)),      # Red ring
        (180, (255, 255, 255, 255)),    # White ring
        (135, (239, 68, 68, 255)),      # Red ring
        (80, (255, 255, 255, 255)),     # White center ring
        (45, (239, 68, 68, 255)),       # Red bullseye
    ]

    for radius, color in rings:
        target_draw.ellipse(
            [center - radius, center - radius,
             center + radius, center + radius],
            fill=color
        )

    # Add shadow/depth to target
    shadow = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    shadow_draw = ImageDraw.Draw(shadow)
    shadow_draw.ellipse(
        [center - 290, center - 280,
         center + 290, center + 300],
        fill=(0, 0, 0, 80)
    )
    shadow_blurred = shadow.filter(ImageFilter.GaussianBlur(radius=30))

    # Composite: background + shadow + target
    img = Image.alpha_composite(img, shadow_blurred)
    img = Image.alpha_composite(img, target)

    # Add dart/arrow hitting bullseye
    dart = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    dart_draw = ImageDraw.Draw(dart)

    # Dart position (slightly offset from center for dynamic feel)
    dart_x = center + 15
    dart_y = center - 20

    # Dart body (teal/green color)
    dart_color = (20, 184, 166, 255)  # Teal
    dart_highlight = (45, 212, 191, 255)  # Lighter teal

    # Dart tip (pointing down-left into the target)
    tip_length = 80
    angle = math.radians(225)  # Angle of dart

    # Calculate dart points
    tip_x = dart_x + math.cos(angle) * 30
    tip_y = dart_y + math.sin(angle) * 30

    # Dart body triangle
    body_width = 25
    body_length = 120

    # Main dart body points
    p1 = (dart_x, dart_y)  # Tip
    p2 = (dart_x + body_length * 0.7, dart_y - body_width)  # Top back
    p3 = (dart_x + body_length * 0.7, dart_y + body_width)  # Bottom back

    # Rotate points around dart_x, dart_y
    def rotate_point(px, py, cx, cy, angle):
        cos_a = math.cos(angle)
        sin_a = math.sin(angle)
        dx = px - cx
        dy = py - cy
        return (cx + dx * cos_a - dy * sin_a, cy + dx * sin_a + dy * cos_a)

    rot_angle = math.radians(-45)
    p1 = rotate_point(p1[0], p1[1], dart_x, dart_y, rot_angle)
    p2 = rotate_point(p2[0], p2[1], dart_x, dart_y, rot_angle)
    p3 = rotate_point(p3[0], p3[1], dart_x, dart_y, rot_angle)

    # Draw dart body
    dart_draw.polygon([p1, p2, p3], fill=dart_color)

    # Dart fins/feathers
    fin_color = (16, 185, 129, 255)  # Green
    fin_p1 = rotate_point(dart_x + body_length * 0.5, dart_y - body_width * 1.8, dart_x, dart_y, rot_angle)
    fin_p2 = rotate_point(dart_x + body_length * 0.7, dart_y - body_width, dart_x, dart_y, rot_angle)
    fin_p3 = rotate_point(dart_x + body_length * 0.9, dart_y - body_width * 1.5, dart_x, dart_y, rot_angle)
    dart_draw.polygon([fin_p1, fin_p2, fin_p3], fill=fin_color)

    # Bottom fin
    fin_p1b = rotate_point(dart_x + body_length * 0.5, dart_y + body_width * 1.8, dart_x, dart_y, rot_angle)
    fin_p2b = rotate_point(dart_x + body_length * 0.7, dart_y + body_width, dart_x, dart_y, rot_angle)
    fin_p3b = rotate_point(dart_x + body_length * 0.9, dart_y + body_width * 1.5, dart_x, dart_y, rot_angle)
    dart_draw.polygon([fin_p1b, fin_p2b, fin_p3b], fill=fin_color)

    # Highlight on dart
    highlight_p1 = rotate_point(dart_x + 10, dart_y - 5, dart_x, dart_y, rot_angle)
    highlight_p2 = rotate_point(dart_x + body_length * 0.5, dart_y - body_width * 0.5, dart_x, dart_y, rot_angle)
    highlight_p3 = rotate_point(dart_x + body_length * 0.5, dart_y, dart_x, dart_y, rot_angle)
    dart_draw.polygon([highlight_p1, highlight_p2, highlight_p3], fill=dart_highlight)

    # Composite dart
    img = Image.alpha_composite(img, dart)

    # Add subtle shine/gloss overlay at top
    shine = Image.new('RGBA', (size, size), (0, 0, 0, 0))
    shine_draw = ImageDraw.Draw(shine)

    # Gradient shine from top
    for y in range(size // 3):
        alpha = int(40 * (1 - y / (size // 3)))
        shine_draw.line([(0, y), (size, y)], fill=(255, 255, 255, alpha))

    img = Image.alpha_composite(img, shine)

    # Convert to RGB for final save (App Store requires no alpha)
    final = Image.new('RGB', (size, size), (255, 255, 255))
    final.paste(img, mask=img.split()[3] if img.mode == 'RGBA' else None)

    # Actually just use the RGB version directly
    final = img.convert('RGB')

    return final

def main():
    print("Creating HabitTracker 2026 App Icon...")

    icon = create_app_icon()

    # Save main icon
    output_path = "/Users/neog/Apps/iOS/HabitTracker2026-iOS/HabitTracker2026/Resources/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png"
    icon.save(output_path, "PNG")
    print(f"Saved: {output_path}")

    # Also save to desktop for preview
    desktop_path = "/Users/neog/Desktop/HabitTracker2026-AppIcon.png"
    icon.save(desktop_path, "PNG")
    print(f"Saved: {desktop_path}")

    print("Done!")

if __name__ == "__main__":
    main()
