# 세종 전체 업종 구조 + 상권 유형 지도

# sejong_analysis.py 에서는 세종지도() 함수만 가져다 씀 ^^

import json
import os

import numpy as np
import folium

from common import *


def 세종지도(now, CATS, dong, comp, cell, prof, BEST_K):
    # 세종 전체 지도 (과제 요구사항: 지역별 업종 구조와 상권 유형을 지도에 시각화)
    log("\n" + "=" * 70)
    log("4. 지도 시각화 ①: 세종 전역 (output/map1_세종_업종구조_상권유형.html)")
    log("=" * 70)

    geo = json.load(open(os.path.join(데이터폴더, "sejong_admdong.geojson"), encoding="utf-8"))
    최다업종 = comp.idxmax(axis=1)   # 동마다 제일 많은 업종

    # 지도에 마우스 올리면 나오는 정보 넣기
    for f in geo["features"]:
        동이름 = f["properties"]["adm_nm"].split()[-1]
        f["properties"]["동"] = 동이름
        if 동이름 in dong.index:
            f["properties"]["업소수"] = int(dong.loc[동이름, "업소수"])
            f["properties"]["최다업종"] = f"{최다업종[동이름]} ({comp.loc[동이름, 최다업종[동이름]]:.0%})"
            f["properties"]["소멸률"] = f"{dong.loc[동이름, '소멸률']:.1%}"
            f["properties"]["체인비율"] = f"{dong.loc[동이름, '체인비율']:.1%}"
            구성 = []
            for c in CATS[:5]:
                구성.append(f"{c} {comp.loc[동이름, c]:.0%}")
            f["properties"]["업종구성"] = " / ".join(구성)

    m1 = 지도만들기([36.53, 127.27], 11)

    # 행정동별 업소 수 색칠
    ch = folium.Choropleth(
        geo_data=geo, data=dong.reset_index(), columns=["행정동명", "업소수"],
        key_on="feature.properties.동", fill_color="Blues", fill_opacity=0.6, line_opacity=0.6,
        legend_name="행정동별 업소 수", name="행정동별 업소 수(단계구분도)",
    ).add_to(m1)
    folium.GeoJsonTooltip(fields=["동", "업소수", "최다업종", "업종구성", "소멸률", "체인비율"],
                          aliases=["행정동", "업소 수", "최다 업종", "상위5 업종 구성", "1년 소멸률", "체인 비율"]
                          ).add_to(ch.geojson)

    # 격자별 상권 유형 (네모 칸)
    격자레이어 = folium.FeatureGroup(name="격자별 상권 유형(K-Means)", show=True)
    dlat = GRID_M / 110540
    dlon = GRID_M / (111320 * np.cos(np.radians(LAT0)))
    for (gx, gy), r in cell.iterrows():
        lat0 = LAT0 + gy * dlat
        lon0 = LON0 + gx * dlon
        top3 = r[CATS].sort_values(ascending=False).head(3)
        글 = f"<b>{r['유형명']}</b><br>{r['대표동']} / 업소 {int(r['업소수'])}개<br>"
        for k, v in top3.items():
            글 += f"{k} {v:.0%}<br>"
        글 += f"1층비율 {r['1층비율']:.0%}, 체인 {r['체인비율']:.0%}"
        folium.Rectangle([[lat0, lon0], [lat0 + dlat, lon0 + dlon]], color="white", weight=1,
                         fill=True, fill_color=COLORS[int(r["군집"]) % 8], fill_opacity=0.75,
                         tooltip=글).add_to(격자레이어)
    격자레이어.add_to(m1)

    # 업종별 업소 위치 (처음엔 꺼놓음)
    for i in range(8):
        c = CATS[i]
        레이어 = folium.FeatureGroup(name=f"업소 위치: {c}", show=False)
        업종업소 = now[now["상권업종대분류명"] == c]
        for _, r in 업종업소.iterrows():
            folium.CircleMarker([r["위도"], r["경도"]], radius=2, color=COLORS[i], fill=True,
                                fill_opacity=0.7, weight=0).add_to(레이어)
        레이어.add_to(m1)

    # 범례 (html로 직접 넣음)
    범례 = "<div style='position:fixed;bottom:30px;left:10px;z-index:9999;background:white;padding:8px 10px;" \
           "border:1px solid #ccc;font-size:12px;border-radius:4px'><b>격자 상권 유형</b>"
    for c in range(BEST_K):
        범례 += f"<div><span style='display:inline-block;width:12px;height:12px;background:{COLORS[c % 8]};" \
                f"margin-right:6px'></span>{prof.loc[c, '유형명']}</div>"
    범례 += "</div>"
    m1.get_root().html.add_child(folium.Element(범례))
    folium.LayerControl(collapsed=False).add_to(m1)
    m1.save(os.path.join(결과폴더, "map1_세종_업종구조_상권유형.html"))
    log("저장 완료")


if __name__ == "__main__":
    from sejong_area import 탐색분석, 상권유형군집
    now, prev, CATS = 데이터준비()
    dong, comp = 탐색분석(now, prev, CATS)
    cell, prof, BEST_K = 상권유형군집(now, prev, CATS)
    세종지도(now, CATS, dong, comp, cell, prof, BEST_K)
