from datetime import date, timedelta from djagitit.tableau import refresh_extracts from loguru import logger from ..config import ( COUNTRY_CODES_BREAKDOWN, QUERY_PATHS, TABLEAU_DATASOURCE_IDS_MS_BREAKDOWN, TABLEAU_SITE, ) from ..db import get_rdb, get_rdbs from ..db.queries import QueryLoader def _to_sql_string(values: list[str]) -> str: return "(" + ",".join(f"'{v}'" for v in values) + ")" def _get_dates(rdb, ql: QueryLoader) -> tuple[date, date]: data = rdb.query(ql.load(QUERY_PATHS.date_ms_breakdown)) return data["base"][0], data["latest_available"][0] def _get_week_list(base: date, latest: date) -> list[date]: return [ base + timedelta(days=7 * i) for i in range(1, ((latest - base).days // 7) + 1) ] def run_update() -> str | None: """Fill market share breakdown table week-by-week, refresh Tableau.""" logger.info("Starting market share breakdown update") rdb = get_rdb() rdbs = get_rdbs() ql = QueryLoader() base, latest = _get_dates(rdb, ql) logger.info(f"Base: {base}, latest available: {latest}") week_list = _get_week_list(base, latest) if not week_list: logger.info("MS breakdown: no new data") return None country_codes_sql = _to_sql_string(COUNTRY_CODES_BREAKDOWN) logger.info(f"MS breakdown: updating {len(week_list)} week(s)") for w in week_list: logger.info(f"Processing {w}") try: rdbs.execute(ql.load( QUERY_PATHS.fill_ms_breakdown, wsds=str(w), country_codes=country_codes_sql, )) rdbs.commit() except Exception as e: logger.error(f"Failed for {w}: {e}") logger.info("Triggering Tableau extract refresh") refresh_extracts(TABLEAU_DATASOURCE_IDS_MS_BREAKDOWN, site=TABLEAU_SITE) logger.success(f"MS breakdown updated to {week_list[-1]}") return week_list[-1].strftime("%Y-%m-%d")