import re
import pandas as pd
from google_play_scraper import reviews, Sort

APP_ID_RE = re.compile(r'^[a-zA-Z0-9._]+$')

def scrape_reviews(app_id: str, count: int = 200, lang: str = 'id', country: str = 'id', sort: str = 'newest'):
    """
    Scrape ulasan dari Google Play.
    :param app_id: ID aplikasi Play Store, mis. com.mobile.legends
    :param count: jumlah ulasan (max disarankan 3000)
    :param lang: bahasa
    :param country: negara
    :return: (DataFrame dengan kolom Sentimen, Score, preview_rows)
    """
    app_id = app_id.strip()
    if not app_id or not APP_ID_RE.match(app_id):
        raise ValueError('ID aplikasi tidak valid. Contoh: com.mobile.legends')
    if count < 10 or count > 3000:
        raise ValueError('Jumlah harus 10–3000')

    sort_map = {
        'newest': Sort.NEWEST,
        'mostRelevant': Sort.MOST_RELEVANT,
        'rating': Sort.RATING,
    }
    sort_val = sort_map.get(sort, Sort.NEWEST)

    # google_play_scraper handles pagination internally when count > 200
    result, _ = reviews(
        app_id,
        lang=lang,
        country=country,
        sort=sort_val,
        count=count,
        filter_score_with=None,
    )

    if not result:
        raise ValueError('Tidak ada ulasan ditemukan untuk ID tersebut (cek ID, bahasa, atau coba sort lain).')

    rows = []
    for r in result:
        content = (r.get('content') or '').strip()
        score = r.get('score')
        if not content:
            continue
        rows.append({'Sentimen': content, 'Score': int(score) if score else 0})

    if not rows:
        raise ValueError('Ulasan ditemukan tapi konten kosong.')

    df = pd.DataFrame(rows)
    return df
