```python
import bpy, math
from mathutils import Vector

# ---------- reset ----------
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
for datablocks in (bpy.data.meshes, bpy.data.curves, bpy.data.materials, bpy.data.cameras, bpy.data.lights):
    pass

# ---------- helpers ----------
def mat(name, color, metallic=0.0, roughness=0.5, emission=None, emission_strength=0.0,
        transmission=0.0, ior=1.45, alpha=1.0):
    m = bpy.data.materials.new(name)
    m.diffuse_color = (*color, alpha)
    m.use_nodes = True
    bs = m.node_tree.nodes.get("Principled BSDF")
    bs.inputs["Base Color"].default_value = (*color, 1)
    bs.inputs["Metallic"].default_value = metallic
    bs.inputs["Roughness"].default_value = roughness
    if "Transmission Weight" in bs.inputs:
        bs.inputs["Transmission Weight"].default_value = transmission
    elif "Transmission" in bs.inputs:
        bs.inputs["Transmission"].default_value = transmission
    if "IOR" in bs.inputs:
        bs.inputs["IOR"].default_value = ior
    if emission:
        if "Emission Color" in bs.inputs:
            bs.inputs["Emission Color"].default_value = (*emission, 1)
            bs.inputs["Emission Strength"].default_value = emission_strength
        else:
            bs.inputs["Emission"].default_value = (*emission, 1)
            bs.inputs["Emission Strength"].default_value = emission_strength
    if alpha < 1:
        bs.inputs["Alpha"].default_value = alpha
        m.surface_render_method = 'DITHERED'
    return m

def assign(obj, material):
    obj.data.materials.append(material)
    return obj

def cyl(name, radius, depth, z, material, vertices=64, scale=(1,1,1)):
    bpy.ops.mesh.primitive_cylinder_add(vertices=vertices, radius=radius, depth=depth, location=(0,0,z))
    o=bpy.context.object; o.name=name; o.scale=scale
    bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
    assign(o, material)
    bevel(o, 0.035, 3)
    return o

def cone(name, r1, r2, depth, z, material, vertices=64):
    bpy.ops.mesh.primitive_cone_add(vertices=vertices, radius1=r1, radius2=r2, depth=depth, location=(0,0,z))
    o=bpy.context.object; o.name=name; assign(o,material); bevel(o,0.025,3); return o

def torus(name, major, minor, z, material, rot=(0,0,0)):
    bpy.ops.mesh.primitive_torus_add(major_radius=major, minor_radius=minor, major_segments=72,
                                     minor_segments=16, location=(0,0,z), rotation=rot)
    o=bpy.context.object; o.name=name; assign(o,material); return o

def bevel(o, amount=0.03, segments=3):
    if hasattr(o.data, "bevel_mode") or hasattr(o.data, "polygons"):
        mod=o.modifiers.new("Soft manufactured edges","BEVEL")
        mod.width=amount; mod.segments=segments
        mod.limit_method='ANGLE'

def cube(name, loc, scale, material, bevel_amt=0.03):
    bpy.ops.mesh.primitive_cube_add(location=loc)
    o=bpy.context.object; o.name=name; o.scale=scale
    bpy.ops.object.transform_apply(location=False, rotation=False, scale=True)
    assign(o,material); bevel(o,bevel_amt,3); return o

def curve_tube(name, pts, radius, material, cyclic=False):
    cu=bpy.data.curves.new(name,'CURVE'); cu.dimensions='3D'; cu.resolution_u=3
    cu.bevel_depth=radius; cu.bevel_resolution=4
    sp=cu.splines.new('NURBS'); sp.points.add(len(pts)-1)
    for p,co in zip(sp.points,pts): p.co=(*co,1)
    sp.order_u=min(3,len(pts)); sp.use_endpoint_u=True; sp.use_cyclic_u=cyclic
    o=bpy.data.objects.new(name,cu); bpy.context.collection.objects.link(o); assign(o,material)
    return o

def look_at(obj, target):
    obj.rotation_euler=(Vector(target)-obj.location).to_track_quat('-Z','Y').to_euler()

# ---------- materials ----------
metal = mat("Graphite black painted steel",(0.025,0.035,0.04), metallic=0.82, roughness=0.24)
edge_metal = mat("Brushed warm metal",(0.20,0.13,0.07), metallic=0.88, roughness=0.22)
dark_metal = mat("Dark iron",(0.018,0.022,0.025), metallic=0.9, roughness=0.3)
glass = mat("Clear warm glass",(0.08,0.16,0.18), roughness=0.08, transmission=0.92, ior=1.46, alpha=0.28)
glow = mat("Hot amber mantle",(1.0,0.16,0.015), roughness=0.25, emission=(1.0,0.08,0.008), emission_strength=9)
glow2 = mat("Golden inner flame",(1.0,0.5,0.04), roughness=0.2, emission=(1.0,0.24,0.015), emission_strength=16)
ground_mat = mat("Charcoal ground",(0.018,0.022,0.025), metallic=0.05, roughness=0.38)

# ---------- ground ----------
bpy.ops.mesh.primitive_plane_add(size=30, location=(0,0,0))
ground=bpy.context.object; ground.name="Simple dark ground"; assign(ground,ground_mat)

# subtle circular warm illumination decal geometry for interactive readability
poolmat=mat("Warm reflected pool",(0.10,0.025,0.006), metallic=0, roughness=0.65,
            emission=(0.18,0.018,0.002), emission_strength=0.35, alpha=0.65)
bpy.ops.mesh.primitive_cylinder_add(vertices=96, radius=2.8, depth=0.008, location=(0,0,0.006))
pool=bpy.context.object; pool.name="Soft warm pool of light"; assign(pool,poolmat)

# ---------- lantern lower base ----------
cyl("Heavy lower foot",1.12,0.30,0.22,metal)
cyl("Base upper shoulder",0.98,0.18,0.43,edge_metal)
torus("Lower rolled rim",0.91,0.075,0.55,edge_metal)
cyl("Lower glass seat",0.86,0.16,0.64,dark_metal)

# feet / small underside pads
for x in (-0.68,0.68):
    for y in (-0.55,0.55):
        cube("Rubber foot",(x,y,0.09),(0.18,0.14,0.08),dark_metal,0.035)

# ---------- glass enclosure ----------
bpy.ops.mesh.primitive_cylinder_add(vertices=96, radius=0.79, depth=1.72, location=(0,0,1.56))
glass_obj=bpy.context.object; glass_obj.name="Transparent glass enclosure"; assign(glass_obj,glass)
# solidify gives believable thickness
sol=glass_obj.modifiers.new("Glass wall thickness","SOLIDIFY"); sol.thickness=0.018
bev=glass_obj.modifiers.new("Rounded glass edges","BEVEL"); bev.width=0.025; bev.segments=3

# glass top and bottom rings
torus("Glass lower retaining ring",0.80,0.055,0.70,edge_metal)
torus("Glass upper retaining ring",0.80,0.055,2.42,edge_metal)

# ---------- glowing core ----------
cyl("Luminous central burner",0.31,1.28,1.53,glow,64)
cyl("Burner lower collar",0.38,0.14,0.87,edge_metal)
torus("Burner collar ring",0.37,0.035,0.95,edge_metal)
# glowing layered flame/mantle shapes
bpy.ops.mesh.primitive_uv_sphere_add(segments=48, ring_count=24, location=(0,0,1.62), scale=(0.27,0.27,0.58))
fl=bpy.context.object; fl.name="Bright glowing mantle"; assign(fl,glow2)
bpy.ops.mesh.primitive_uv_sphere_add(segments=40, ring_count=20, location=(0,0,1.72), scale=(0.16,0.16,0.43))
fl2=bpy.context.object; fl2.name="Inner golden flame"; assign(fl2,glow2)

# ---------- top ----------
torus("Top glass crown ring",0.82,0.065,2.50,edge_metal)
cyl("Top cap lower band",0.92,0.22,2.63,metal)
cone("Ventilator domed hood",0.92,0.52,0.38,2.92,metal)
cyl("Top chimney neck",0.34,0.18,3.16,dark_metal)
cyl("Vent cap",0.48,0.12,3.28,edge_metal)
torus("Vent cap rim",0.44,0.045,3.34,edge_metal)

# radial ventilation slots as bright/dark bars around cap
for i in range(12):
    a=2*math.pi*i/12
    x,y=0.70*math.cos(a),0.70*math.sin(a)
    bar=cube("Ventilation slot",(x,y,2.86),(0.035,0.13,0.09),dark_metal,0.01)
    bar.rotation_euler[2]=a

# ---------- structural frame ----------
# four stout corner rails around glass
for i,(x,y) in enumerate([(0.68,0.68),(-0.68,0.68),(-0.68,-0.68),(0.68,-0.68)]):
    bpy.ops.mesh.primitive_cylinder_add(vertices=24, radius=0.055, depth=2.12, location=(x,y,1.56))
    r=bpy.context.object; r.name=f"Vertical protective frame rail {i+1}"; assign(r,metal); bevel(r,0.012,2)

# horizontal guard bands
for z in (0.82,1.56,2.30):
    torus(f"Protective horizontal band {z}",0.89,0.045,z,metal)

# handle: broad arched metal carry handle in the camera-facing x-z plane
pts=[]
for i in range(17):
    t=i/16
    x=-0.86+1.72*t
    z=2.98 + 0.92*math.sin(math.pi*t)
    pts.append((x,-0.02,z))
handle=curve_tube("Large carry handle",pts,0.075,edge_metal)
# handle mounting bosses
for x in (-0.84,0.84):
    bpy.ops.mesh.primitive_uv_sphere_add(segments=32, ring_count=16, location=(x,0,2.98), scale=(0.13,0.13,0.13))
    assign(bpy.context.object,edge_metal)

# ---------- lights ----------
def point(name, loc, energy, color, radius=0.25):
    data=bpy.data.lights.new(name,'POINT'); data.energy=energy; data.color=color; data.shadow_soft_size=radius
    o=bpy.data.objects.new(name,data); bpy.context.collection.objects.link(o); o.location=loc; return o

point("Warm light inside lantern",(0,0,1.55),420,(1.0,0.16,0.025),0.35)
point("Amber glow on floor",(0,0,0.55),180,(1.0,0.12,0.025),0.8)

data=bpy.data.lights.new("Large softbox","AREA"); data.energy=500; data.shape='DISK'; data.size=5.0; data.color=(0.48,0.58,0.68)
key=bpy.data.objects.new("Large softbox",data); bpy.context.collection.objects.link(key); key.location=(-4,-5,6); look_at(key,(0,0,1.4))

data=bpy.data.lights.new("Warm rim light","AREA"); data.energy=700; data.shape='DISK'; data.size=3; data.color=(1.0,0.20,0.05)
rim=bpy.data.objects.new("Warm rim light",data); bpy.context.collection.objects.link(rim); rim.location=(4,2,4.5); look_at(rim,(0,0,1.7))

# ---------- camera ----------
camdata=bpy.data.cameras.new("Presentation Camera"); cam=bpy.data.objects.new("Presentation Camera",camdata)
bpy.context.collection.objects.link(cam)
cam.location=(5.2,-7.6,4.2); camdata.lens=58; camdata.sensor_width=36
look_at(cam,(0,0,1.62)); bpy.context.scene.camera=cam

# ---------- world/render ----------
world=bpy.context.scene.world
world.use_nodes=True
world.node_tree.nodes["Background"].inputs["Color"].default_value=(0.004,0.006,0.009,1)
world.node_tree.nodes["Background"].inputs["Strength"].default_value=0.16

scene=bpy.context.scene
scene.render.engine='BLENDER_EEVEE_NEXT'
scene.render.resolution_x=1536; scene.render.resolution_y=1536; scene.render.resolution_percentage=100
scene.render.image_settings.file_format='PNG'
scene.render.filepath="/tmp/camping_lantern.png"
scene.render.film_transparent=False
scene.view_settings.look='AgX - Medium High Contrast'
scene.render.image_settings.color_mode='RGBA'

# organize names and select camera
bpy.ops.object.select_all(action='DESELECT')
cam.select_set(True); bpy.context.view_layer.objects.active=cam

# save
bpy.ops.wm.save_as_mainfile(filepath="/tmp/camping_lantern.blend")
```