def normalize_keywords(top_keywords):
    return [str(x.get("keyword", "")).strip() for x in (top_keywords or []) if str(x.get("keyword", "")).strip()]


def contains_any(text, tokens):
    return any(token in text for token in tokens)


def count_matching_keywords(keyword_texts, token_groups):
    count = 0
    for kw in keyword_texts:
        if any(token in kw for token in token_groups):
            count += 1
    return count


def build_real_estate_consulting(analysis, posts):
    comments = []
    actions = []

    top_keywords = analysis.get("top_keywords", []) or []
    keyword_texts = normalize_keywords(top_keywords)

    joined_keywords = " ".join(keyword_texts)
    post_titles = [str(p.get("title", "")).strip() for p in (posts or []) if str(p.get("title", "")).strip()]
    joined_titles = " ".join(post_titles)

    region_tokens = [
        "서울", "경기", "인천", "수원", "용인", "성남", "화성", "동탄", "오산",
        "평택", "안양", "안산", "과천", "광명", "시흥", "하남", "남양주", "김포",
        "파주", "고양", "의정부", "대전", "대구", "부산", "광주", "울산", "세종", "제주"
    ]

    property_tokens = [
        "아파트", "오피스텔", "빌라", "주택", "상가", "토지", "원룸", "투룸", "다가구"
    ]

    transaction_tokens = [
        "매매", "전세", "월세", "분양", "임대", "급매", "실거주", "투자", "매물"
    ]

    demand_tokens = [
        "역세권", "학군", "입지", "교통", "생활권", "호재", "시세", "실거래", "가격", "추천"
    ]

    consultation_tokens = [
        "문의", "상담", "연락", "전화", "방문", "안내", "중개", "도와드", "문의주세요"
    ]

    apartment_name_like_tokens = [
        "자이", "래미안", "푸르지오", "더샵", "힐스테이트", "롯데캐슬", "아이파크",
        "e편한", "리슈빌", "센트럴", "파크", "캐슬", "타운", "하이츠"
    ]

    region_kw_count = count_matching_keywords(keyword_texts, region_tokens)
    property_kw_count = count_matching_keywords(keyword_texts, property_tokens)
    transaction_kw_count = count_matching_keywords(keyword_texts, transaction_tokens)
    demand_kw_count = count_matching_keywords(keyword_texts, demand_tokens)

    has_consultation_title = contains_any(joined_titles, consultation_tokens)
    has_apartment_name = contains_any(joined_keywords + " " + joined_titles, apartment_name_like_tokens)

    # 1) 지역 키워드
    if region_kw_count == 0:
        comments.append("지역명 키워드가 상위 키워드에 거의 보이지 않아 지역 기반 유입 확보에 불리할 수 있습니다.")
        actions.append("제목과 본문에 지역명(예: 동탄, 화성, 수원 등)을 더 명확히 반영하세요.")
    elif region_kw_count >= 2:
        comments.append("지역명 키워드가 일부 반영되어 있어 지역 검색 유입 기반은 어느 정도 확보되어 있습니다.")

    # 2) 매물 유형
    if property_kw_count == 0:
        comments.append("매물 유형 키워드가 부족해 어떤 부동산을 다루는 블로그인지 명확성이 약할 수 있습니다.")
        actions.append("아파트, 오피스텔, 상가, 빌라 등 매물 유형 키워드를 더 자주 노출하세요.")
    elif property_kw_count >= 2:
        comments.append("매물 유형 키워드가 반영되어 있어 콘텐츠 주제는 비교적 분명한 편입니다.")

    # 3) 거래 유형
    if transaction_kw_count == 0:
        comments.append("거래 유형 키워드가 부족해 실수요 검색 유입을 놓칠 가능성이 있습니다.")
        actions.append("매매, 전세, 월세, 급매, 분양 같은 거래 키워드를 제목에 적극적으로 넣어보세요.")
    elif transaction_kw_count >= 2:
        comments.append("거래 유형 키워드가 포함되어 있어 실수요 중심 검색 대응에는 긍정적입니다.")

    # 4) 실수요 정보형
    if demand_kw_count == 0:
        comments.append("입지, 교통, 학군, 시세 같은 실수요 정보형 키워드가 부족한 편입니다.")
        actions.append("매물 소개 외에도 입지 분석, 학군, 시세, 교통 정보형 글을 섞는 것이 좋습니다.")
    elif demand_kw_count >= 2:
        comments.append("실수요 정보형 키워드가 일부 보여 정보형 콘텐츠 확장 가능성이 있습니다.")

    # 5) 단지명 / 브랜드명
    if not has_apartment_name:
        comments.append("단지명 또는 아파트 브랜드 키워드가 뚜렷하지 않아 특정 매물 검색 대응이 약할 수 있습니다.")
        actions.append("단지명, 브랜드명, 아파트명 중심의 상세 글을 보강해 검색 정밀도를 높이세요.")
    else:
        comments.append("단지명 또는 브랜드명 키워드가 일부 보여 특정 매물 검색 대응에는 강점이 있습니다.")

    # 6) 상담 유도 문구
    if not has_consultation_title:
        comments.append("상담 유도형 문구가 부족해 실제 문의 전환 측면에서는 다소 약할 수 있습니다.")
        actions.append("문의, 상담, 안내, 연락 같은 전환 유도 문구를 자연스럽게 포함해보세요.")

    # 7) 제목 편중
    if len(post_titles) >= 4:
        listing_like_count = sum(
            1 for title in post_titles
            if contains_any(title, property_tokens) and contains_any(title, transaction_tokens)
        )
        info_like_count = sum(
            1 for title in post_titles
            if contains_any(title, demand_tokens) or contains_any(title, ["시세", "분석", "비교", "체크"])
        )

        if listing_like_count >= len(post_titles) * 0.8:
            comments.append("최근 글이 매물형 제목에 편중되어 있어 정보형 유입 확장이 제한될 수 있습니다.")
            actions.append("매물형 글과 함께 지역 분석, 시세 분석, 입지 설명형 글을 섞어 운영하세요.")

        if info_like_count == 0:
            comments.append("최근 글에서 정보형 제목 비중이 낮아 검색 유입 폭이 좁아질 수 있습니다.")
            actions.append("‘시세’, ‘입지’, ‘학군’, ‘비교’ 같은 정보형 제목을 주기적으로 넣어보세요.")

    # 중복 제거
    dedup_comments = []
    seen_comments = set()
    for item in comments:
        if item not in seen_comments:
            seen_comments.add(item)
            dedup_comments.append(item)

    dedup_actions = []
    seen_actions = set()
    for item in actions:
        if item not in seen_actions:
            seen_actions.add(item)
            dedup_actions.append(item)

    return {
        "comments": dedup_comments[:6],
        "actions": dedup_actions[:5]
    }