"""鸦堡一层场景图 v3(功能动线合理化,44×36 tile = 1408×1152)。

布局逻辑(对照真实宅邸动线):
  北翼(私密/功能): 书房·剪辑室 | 放映室 | 道具间 | 楼梯塔(NE)
  画廊走廊(东西贯通,所有北翼房间由此进出)
  中段(会客):    大客厅(W,贴门厅) | 大门厅(中,纵贯) | 餐厅(E)
  南翼:          琴房(SW,最安静) | 正门(S)        | 厨房(SE,餐厅正下方,服务门直连 + 后梯下地窖)

家具原则:炉/柜/架靠墙,挂件上墙,坐具成组,走道留空。
运行:python -m genesis.mapgen.castle_f1
"""

from __future__ import annotations

import logging
from pathlib import Path

from genesis.mapgen.interior import InteriorSpec, Room, build_interior

logger = logging.getLogger(__name__)

ROOT = Path(__file__).resolve().parents[3]
OBJECT_DIR = ROOT / "assets/sprites/objects/ravenisle"
FLOORS_DIR = OBJECT_DIR / "floors"
OUT_PATH = ROOT / "assets/sprites/maps/ravenisle/castle_f1.png"

ROOMS = [
    Room(
        "study", "书房(剪辑室)", (2, 2, 11, 9), "parquet", face="wall_wood",
        furniture=[
            ("bookshelf.png", 150, 172),     # 书墙×2 靠北墙
            ("bookshelf.png", 305, 172),
            ("wall_safe.png", 365, 142),     # 保险柜嵌在书架旁的墙里
            ("editing_desk.png", 200, 290),  # 剪辑台居中,绿灯
            ("armchair.png", 95, 280),
        ],
        glows=[(205, 250, 28, (140, 220, 150), 0.38)],
        anchor=(210, 240),
    ),
    Room(
        "screening", "放映室", (13, 2, 24, 9), "stone", face="wall_stone",
        furniture=[
            ("movie_screen.png", 608, 180),  # 银幕贴北墙
            ("cinema_seats.png", 608, 268),  # 观众席面向银幕
            ("projector.png", 608, 320),     # 放映机在席后
        ],
        glows=[(608, 150, 44, (200, 215, 235), 0.30)],
        anchor=(608, 250),
    ),
    Room(
        "prop_room", "道具间", (26, 2, 35, 9), "stone", face="wall_stone",
        furniture=[
            ("prop_shelves.png", 935, 172),  # 道具架靠北墙
            ("trunk.png", 1105, 165),        # 上锁场记箱在架旁墙根
            ("mannequin.png", 870, 290),     # 戏服人台
        ],
        anchor=(990, 240),
    ),
    Room(
        "stairtower", "楼梯塔", (37, 2, 42, 9), "stone", face="wall_stone",
        furniture=[("staircase.png", 1280, 308)],
        glows=[(1280, 190, 34, (255, 190, 100), 0.42)],
        anchor=(1280, 280),
    ),
    Room(
        "corridor", "画廊走廊", (2, 11, 42, 14), "parquet", face="wall_wood",
        furniture=[
            ("column.png", 368, 478),        # 石柱对称分布在门洞之间
            ("column.png", 576, 478),
            ("column.png", 832, 478),
            ("column.png", 1040, 478),
            ("sideboard.png", 1240, 474),  # 服务边柜守在餐厅门外(上菜动线)
        ],
        glows=[(472, 430, 22, (255, 190, 100), 0.34), (936, 430, 22, (255, 190, 100), 0.34)],
        anchor=(704, 416),
    ),
    Room(
        "living", "大客厅", (2, 16, 13, 25), "parquet", face="wall_wood",
        furniture=[
            ("bar_cabinet.png", 385, 615),   # 酒柜靠北墙(七只斟好的酒杯)
            ("sofa.png", 200, 628),          # 沙发组围着茶几
            ("low_table.png", 200, 700),
            ("armchair.png", 322, 712),
            ("card_table.png", 130, 778),    # 牌桌靠西墙角
        ],
        glows=[(385, 580, 24, (255, 190, 100), 0.40), (200, 660, 30, (255, 195, 105), 0.30)],
        anchor=(220, 680),
    ),
    Room(
        "hall", "大门厅", (15, 16, 28, 33), "parquet", face="wall_wood",
        furniture=[
            ("fireplace.png", 542, 648),         # 壁炉贴西墙
            ("grandfather_clock.png", 872, 622), # 落地钟守东北角
            ("candelabra.png", 600, 782),        # 四座烛台对称夹红毯
            ("candelabra.png", 808, 782),
            ("candelabra.png", 600, 1022),
            ("candelabra.png", 808, 1022),
            ("notice_board.png", 852, 1072),     # 留言板立在正门旁——进门第一眼
            ("double_door.png", 704, 1148),      # 正门
        ],
        glows=[(542, 602, 50, (255, 165, 70), 0.62),
               (603, 740, 24, (255, 190, 100), 0.42), (810, 740, 24, (255, 190, 100), 0.42),
               (603, 980, 24, (255, 190, 100), 0.42), (810, 980, 24, (255, 190, 100), 0.42),
               (550, 545, 30, (150, 175, 225), 0.26), (860, 545, 30, (150, 175, 225), 0.26)],
        anchor=(704, 880),
    ),
    Room(
        "dining", "餐厅", (30, 16, 42, 24), "parquet", face="wall_wood",
        furniture=[
            ("dining_table.png", 1168, 748), # 长桌居中(七副餐具+七个胶片盒)
        ],
        glows=[(1078, 642, 26, (255, 195, 105), 0.42), (1258, 642, 26, (255, 195, 105), 0.42)],
        anchor=(1168, 660),
    ),
    Room(
        "music_room", "琴房", (2, 27, 13, 33), "parquet", face="wall_wood",
        furniture=[
            ("grand_piano.png", 225, 1000),  # 三角钢琴朝向房间中央
            ("candelabra.png", 385, 952),
        ],
        glows=[(388, 922, 24, (255, 190, 100), 0.42)],
        anchor=(240, 980),
    ),
    Room(
        "kitchen", "厨房", (30, 26, 42, 33), "stone", face="wall_stone",
        furniture=[
            ("stove.png", 1032, 938),        # 灶台贴北墙
            ("prep_table.png", 1168, 995),   # 中岛备餐台
            ("cellar_stairs.png", 1330, 945),# 后梯下地窖(东墙)
        ],
        glows=[(1032, 905, 26, (255, 150, 70), 0.46)],
        anchor=(1130, 980),
    ),
]

DOORS = [
    (5, 10, 6, 10, "parquet"),      # 走廊 ↔ 书房
    (18, 10, 19, 10, "stone"),      # 走廊 ↔ 放映室
    (30, 10, 31, 10, "stone"),      # 走廊 ↔ 道具间
    (39, 10, 40, 10, "stone"),      # 走廊 ↔ 楼梯塔
    (6, 15, 7, 15, "parquet"),      # 走廊 ↔ 大客厅
    (20, 15, 23, 15, "carpet"),     # 走廊 ↔ 门厅(红毯拱门)
    (35, 15, 36, 15, "parquet"),    # 走廊 ↔ 餐厅
    (14, 19, 14, 21, "parquet"),    # 门厅 ↔ 大客厅
    (29, 18, 29, 20, "parquet"),    # 门厅 ↔ 餐厅
    (14, 29, 14, 31, "parquet"),    # 门厅 ↔ 琴房
    (29, 28, 29, 30, "parquet"),    # 门厅 ↔ 厨房
    (35, 25, 36, 25, "stone"),      # 餐厅 ↔ 厨房(服务门,上菜动线)
    (20, 34, 23, 34, "carpet"),     # 正门门洞
]

PATCHES = [
    (3, 12, 41, 13, "carpet"),      # 走廊红毯
    (20, 16, 23, 33, "carpet"),     # 门厅红毯直通正门
    (4, 19, 11, 23, "carpet"),      # 大客厅会客区地毯
]

WALL_OBJECTS = [
    ("window_arch.png", 550, 516),  # 门厅北墙月光窗 ×2(拱门两侧)
    ("window_arch.png", 860, 516),
    ("weapon_rack.png", 1000, 96),  # 道具间:猎枪架挂墙
    ("knife_rack.png", 1100, 845),  # 厨房北墙刀架(缺一格)
]

SPEC = InteriorSpec(name="castle_f1", size_tiles=(44, 36), rooms=ROOMS,
                    doors=DOORS, patches=PATCHES, wall_objects=WALL_OBJECTS)


def main() -> None:
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s")
    img = build_interior(SPEC, FLOORS_DIR, OBJECT_DIR)
    OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
    img.save(OUT_PATH)
    logger.info("✅ 鸦堡一层(v3)已合成 → %s (%dx%d)", OUT_PATH, *img.size)


if __name__ == "__main__":
    main()
