from PIL import Image, ImageDraw, ImageFont
import random

# 画布基础配置
WIDTH = 600
HEIGHT = 400
BG_COLOR_CLEAR = (120, 180, 255)    # 晴天蓝天
BG_COLOR_CLOUD = (170, 185, 200)    # 多云灰蓝天
BG_COLOR_RAIN = (90, 100, 115)      # 雨天暗沉灰
BG_COLOR_SNOW = (200, 220, 240)     # 雪天冷白蓝
BG_COLOR_THUNDER = (40, 40, 50)     # 雷暴深灰黑

def draw_sun(draw):
    """绘制太阳"""
    # 太阳本体
    draw.ellipse((480, 60, 560, 140), fill=(255, 220, 0))
    # 太阳光晕线条
    for i in range(8):
        import math
        rad = math.radians(i * 45)
        x1 = 520 + 50 * math.cos(rad)
        y1 = 100 + 50 * math.sin(rad)
        x2 = 520 + 80 * math.cos(rad)
        y2 = 100 + 80 * math.sin(rad)
        draw.line((x1, y1, x2, y2), fill=(255, 200, 0), width=4)

def draw_cloud(draw, x, y, size=1):
    """绘制云朵，可指定位置大小"""
    r = int(35 * size)
    draw.ellipse((x, y, x + r, y + r), fill=(255, 255, 255))
    draw.ellipse((x + r*0.7, y - r*0.3, x + r*1.7, y + r*0.7), fill=(255, 255, 255))
    draw.ellipse((x + r*1.4, y, x + r*2.4, y + r), fill=(255, 255, 255))
    draw.ellipse((x + r*0.3, y + r*0.2, x + r*1.3, y + r*1.2), fill=(255, 255, 255))

def draw_rain(draw):
    """绘制雨滴"""
    for _ in range(80):
        x = random.randint(0, WIDTH)
        y = random.randint(100, HEIGHT)
        length = random.randint(10, 25)
        draw.line((x, y, x-3, y+length), fill=(180, 220, 255), width=2)

def draw_snowflake(draw):
    """绘制雪花"""
    for _ in range(60):
        x = random.randint(0, WIDTH)
        y = random.randint(50, HEIGHT)
        s = random.randint(2,5)
        draw.ellipse((x-s, y-s, x+s, y+s), fill=(255,255,255))

def draw_lightning(draw):
    """绘制闪电"""
    points = [(320, 80), (290, 160), (330, 180), (280, 280), (340, 300)]
    draw.line(points, fill=(255, 255, 80), width=6)
    draw.line(points, fill=(255, 255, 200), width=3)

def create_weather_img(weather_type: str, save_path="weather_img.png"):
    """
    生成天气插画
    :param weather_type: 可选 sunny / cloudy / overcast / rain / snow / thunder
    :param save_path: 图片保存路径
    :return: Image对象
    """
    # 初始化画布
    img = Image.new("RGB", (WIDTH, HEIGHT), color=(255,255,255))
    draw = ImageDraw.Draw(img)

    # 匹配背景色
    if weather_type == "sunny":
        bg = BG_COLOR_CLEAR
    elif weather_type in ("cloudy", "overcast"):
        bg = BG_COLOR_CLOUD
    elif weather_type == "rain":
        bg = BG_COLOR_RAIN
    elif weather_type == "snow":
        bg = BG_COLOR_SNOW
    elif weather_type == "thunder":
        bg = BG_COLOR_THUNDER
    else:
        bg = BG_COLOR_CLEAR

    draw.rectangle([0, 0, WIDTH, HEIGHT], fill=bg)

    # 绘制对应天气元素
    if weather_type == "sunny":
        draw_sun(draw)
        draw_cloud(draw, 80, 90, size=0.8)
    elif weather_type == "cloudy":
        draw_sun(draw)
        draw_cloud(draw, 120, 100, size=1.2)
        draw_cloud(draw, 250, 70, size=1)
        draw_cloud(draw, 380, 110, size=1.1)
    elif weather_type == "overcast":
        draw_cloud(draw, 50, 80, size=1.5)
        draw_cloud(draw, 180, 60, size=1.6)
        draw_cloud(draw, 320, 90, size=1.4)
        draw_cloud(draw, 450, 75, size=1.5)
    elif weather_type == "rain":
        draw_cloud(draw, 100, 60, size=1.8)
        draw_cloud(draw, 300, 50, size=1.7)
        draw_rain(draw)
    elif weather_type == "snow":
        draw_cloud(draw, 150, 70, size=1.5)
        draw_cloud(draw, 350, 65, size=1.4)
        draw_snowflake(draw)
    elif weather_type == "thunder":
        draw_cloud(draw, 80, 40, size=2)
        draw_cloud(draw, 280, 30, size=2.2)
        draw_lightning(draw)
        draw_rain(draw)

    # 绘制地面小草
    for x in range(20, WIDTH, 30):
        draw.line((x, HEIGHT, x+5, HEIGHT-20), fill=(30,120,40), width=3)
        draw.line((x+10, HEIGHT, x+5, HEIGHT-15), fill=(40,140,50), width=3)

    # 写入中文天气文字（兼容Windows/macOS/linux）
    try:
        font = ImageFont.truetype("msyh.ttc", 28)
    except:
        try:
            font = ImageFont.truetype("SimHei.ttf", 28)
        except:
            font = ImageFont.load_default()

    text_map = {
        "sunny": "☀ 晴天",
        "cloudy": "⛅ 多云",
        "overcast": "☁ 阴天",
        "rain": "🌧 下雨",
        "snow": "❄ 下雪",
        "thunder": "⛈ 雷暴"
    }
    text = text_map.get(weather_type, "未知天气")
    draw.text((20, 20), text, font=font, fill=(255,255,255), stroke_width=1, stroke_fill=(0,0,0))

    # 保存+返回图片
    img.save(save_path)
    return img

# ====================== 调用示例 ======================
if __name__ == "__main__":
    weather_list = ["sunny", "cloudy", "overcast", "rain", "snow", "thunder"]

    # 批量生成所有天气插画
    for weather in weather_list:
        pic = create_weather_img(weather, save_path=f"{weather}_插画.png")
        pic.show()

    # 单独生成某一种天气
    # create_weather_img("rain").show()