"""
네이버 플레이스 모니터링 스케줄러
- 매일 오전 9시: 업체 통계 + 리뷰 수집
- 매주 월요일: 키워드 순위 체크
- 신규 리뷰 감지 시 알림 발송
"""

import schedule
import time
import logging
from datetime import datetime

from crawler import (
    get_place_summary,
    get_place_reviews,
    get_place_rank,
    analyze_review_keywords,
    print_summary,
    print_rank,
)
# from db import save_stats, save_reviews, save_rank, save_keywords, get_active_places
# from notify import send_kakao_alert, send_email_alert  # 알림 모듈 (선택)

# ─────────────────────────────────────────
# 로깅 설정
# ─────────────────────────────────────────
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("monitor.log", encoding="utf-8"),
        logging.StreamHandler(),
    ]
)
log = logging.getLogger(__name__)


# ─────────────────────────────────────────
# 테스트용 업체 목록 (DB 미사용 시)
# ─────────────────────────────────────────
PLACES = [
    {
        "place_id"   : "1234567890",   # ← 실제 place_id
        "client_name": "고객사A",
        "keywords"   : ["강남 맛집", "강남 한식"],
    },
    # 업체 추가 시 여기에 계속 추가
]


# ─────────────────────────────────────────
# 작업 함수들
# ─────────────────────────────────────────
def job_collect_stats():
    """매일 실행: 기본 통계 수집"""
    log.info("=" * 40)
    log.info("📍 [일별] 업체 통계 수집 시작")

    for place in PLACES:
        pid = place["place_id"]
        log.info(f"  처리 중: {place['client_name']} ({pid})")

        summary = get_place_summary(pid)
        if summary:
            print_summary(summary)
            # save_stats(summary)   # DB 저장 활성화 시 주석 해제

        reviews = get_place_reviews(pid, page=1, size=20)
        if reviews:
            log.info(f"  새 리뷰 {len(reviews)}개 수집")
            # new_count = save_reviews(pid, reviews)
            # if new_count > 0:
            #     send_kakao_alert(f"새 리뷰 {new_count}개 등록됨!")

        time.sleep(2)  # 업체 간 요청 간격

    log.info("✅ 통계 수집 완료")


def job_check_rank():
    """주 1회 실행: 키워드 순위 체크"""
    log.info("=" * 40)
    log.info("📊 [주간] 키워드 순위 체크 시작")

    for place in PLACES:
        pid = place["place_id"]
        for kw in place.get("keywords", []):
            rank_data = get_place_rank(kw, pid)
            if rank_data:
                print_rank(rank_data)
                # save_rank(rank_data)  # DB 저장

                # 순위 하락 알림 (예: 10위 밖으로 떨어지면)
                my_rank = rank_data.get("my_rank")
                if my_rank is None or my_rank > 10:
                    log.warning(f"⚠️  [{kw}] 순위 하락: {my_rank}위")
                    # send_kakao_alert(f"[{kw}] 순위 {my_rank}위로 하락!")

            time.sleep(1.5)

    log.info("✅ 순위 체크 완료")


def job_analyze_keywords():
    """주 1회 실행: 리뷰 키워드 분석"""
    log.info("📝 [주간] 리뷰 키워드 분석 시작")

    for place in PLACES:
        pid = place["place_id"]
        reviews = get_place_reviews(pid, page=1, size=100)
        if reviews:
            keywords = analyze_review_keywords(reviews, top_n=20)
            log.info(f"  [{place['client_name']}] 주요 키워드: "
                     f"{', '.join([k['keyword'] for k in keywords[:5]])}")
            # save_keywords(pid, keywords)  # DB 저장

    log.info("✅ 키워드 분석 완료")


# ─────────────────────────────────────────
# 스케줄 등록
# ─────────────────────────────────────────
def setup_schedule():
    # 매일 오전 9시 통계 수집
    schedule.every().day.at("09:00").do(job_collect_stats)

    # 매주 월요일 오전 10시 순위 체크
    schedule.every().monday.at("10:00").do(job_check_rank)

    # 매주 월요일 오전 10시 30분 키워드 분석
    schedule.every().monday.at("10:30").do(job_analyze_keywords)

    log.info("✅ 스케줄 등록 완료")
    log.info("  - 매일 09:00 → 업체 통계 수집")
    log.info("  - 매주 월요일 10:00 → 키워드 순위")
    log.info("  - 매주 월요일 10:30 → 리뷰 분석")


# ─────────────────────────────────────────
# 메인 실행
# ─────────────────────────────────────────
if __name__ == "__main__":
    log.info("🚀 네이버 플레이스 모니터링 시작")

    # 시작 즉시 1회 실행 (테스트)
    log.info("▶ 즉시 실행 (테스트)")
    job_collect_stats()
    job_check_rank()

    # 스케줄 등록
    setup_schedule()

    # 무한 루프 (스케줄 대기)
    while True:
        schedule.run_pending()
        time.sleep(60)
