import requests 
import bz2
import shutil
import os

import concurrent.futures

YEARLY_PROJECTS = [
    "dewiki", "frwiki", "eswiki", "itwiki", "ruwiki", "jawiki", "viwiki", "zhwiki", 
    "ptwiki", "enwiktionary", "plwiki", "nlwiki", "svwiki", "metawiki", "arwiki", 
    "shwiki", "cebwiki", "mgwiktionary", "fawiki", "frwiktionary", "ukwiki", 
    "hewiki", "kowiki", "srwiki", "trwiki", "loginwiki", "huwiki", "cawiki", 
    "nowiki", "mediawikiwiki", "fiwiki", "cswiki", "idwiki", "rowiki", "enwikisource", 
    "frwikisource", "ruwiktionary", "dawiki", "bgwiki", "incubatorwiki", 
    "enwikinews", "specieswiki", "thwiki"
]

MONTHLY_PROJECTS = ["wikidatawiki", "commonswiki", "enwiki"]

ALL_PROJECTS = [
    "aawiki", "aawikibooks", "aawiktionary", "abwiki", "abwiktionary", "acewiki",
    "adywiki", "aewikimedia", "afwiki", "afwikibooks", "afwikiquote", "afwiktionary",
    "akwiki", "akwikibooks", "akwiktionary", "alswiki", "altwiki", "amiwiki",
    "amwiki", "amwikimedia", "amwikiquote", "amwiktionary", "angwiki", "angwikibooks",
    "angwikiquote", "angwikisource", "angwiktionary", "anpwiki", "anwiki", 
    "anwiktionary", "arcwiki", "arwiki", "arwikibooks", "arwikimedia", "arwikinews",
    "arwikiquote", "arwikisource", "arwikiversity", "arwiktionary", "arywiki",
    "arzwiki", "astwiki", "astwikibooks", "astwikiquote", "astwiktionary", "aswiki",
    "aswikibooks", "aswikiquote", "aswikisource", "aswiktionary", "atjwiki",
    "avkwiki", "avwiki", "avwiktionary", "awawiki", "aywiki", "aywikibooks",
    "aywiktionary", "azbwiki", "azwiki", "azwikibooks", "azwikiquote", "azwikisource",
    "azwiktionary", "banwiki", "banwikisource", "barwiki", "bat_smgwiki", "bawiki",
    "bawikibooks", "bbcwiki", "bclwiki", "bclwikiquote", "bclwiktionary", "bdwikimedia",
    "be_x_oldwiki", "betawikiversity", "bewiki", "bewikibooks", "bewikimedia",
    "bewikiquote", "bewikisource", "bewiktionary", "bewwiki", "bgwiki", "bgwikibooks",
    "bgwikinews", "bgwikiquote", "bgwikisource", "bgwiktionary", "bhwiki",
    "bhwiktionary", "biwiki", "biwikibooks", "biwiktionary", "bjnwiki", 
    "bjnwikiquote", "bjnwiktionary", "blkwiki", "blkwiktionary", "bmwiki",
    "bmwikibooks", "bmwikiquote", "bmwiktionary", "bnwiki", "bnwikibooks", "bnwikiquote",
    "bnwikisource", "bnwikivoyage", "bnwiktionary", "bowiki", "bowikibooks", 
    "bowiktionary", "bpywiki", "brwiki", "brwikimedia", "brwikiquote", "brwikisource",
    "brwiktionary", "bswiki", "bswikibooks", "bswikinews", "bswikiquote",
    "bswikisource", "bswiktionary", "btmwiki", "btmwiktionary", "bugwiki",
    "bxrwiki", "cawiki", "cawikibooks", "cawikimedia", "cawikinews", "cawikiquote",
    "cawikisource", "cawiktionary", "cbk_zamwiki", "cdowiki", "cebwiki",
    "cewiki", "chowiki", "chrwiki", "chrwiktionary", "chwiki", "chwikibooks",
    "chwiktionary", "chywiki", "ckbwiki", "ckbwiktionary", "cnwikimedia", "commonswiki",
    "cowiki", "cowikibooks", "cowikimedia", "cowikiquote", "cowiktionary",
    "crhwiki", "crwiki", "crwikiquote", "crwiktionary", "csbwiki", "csbwiktionary",
    "cswiki", "cswikibooks", "cswikinews", "cswikiquote", "cswikisource", "cswikiversity",
    "cswikivoyage", "cswiktionary", "cuwiki", "cvwiki", "cvwikibooks", "cywiki",
    "cywikibooks", "cywikiquote", "cywikisource", "cywiktionary", "dagwiki",
    "dawiki", "dawikibooks", "dawikiquote", "dawikisource", "dawiktionary",
    "dewiki", "dewikibooks", "dewikinews", "dewikiquote", "dewikisource",
    "dewikiversity", "dewikivoyage", "dewiktionary", "dgawiki", "dinwiki", "diqwiki",
    "diqwiktionary", "dkwikimedia", "donatewiki", "dsbwiki", "dtpwiki", "dtywiki",
    "dvwiki", "dvwiktionary", "dzwiki", "dzwiktionary", "eewiki", "elwiki",
    "elwikibooks", "elwikinews", "elwikiquote", "elwikisource", "elwikiversity",
    "elwikivoyage", "elwiktionary", "emlwiki", "enwiki", "enwikibooks", "enwikinews",
    "enwikiquote", "enwikisource", "enwikiversity", "enwikivoyage", "enwiktionary",
    "eowiki", "eowikibooks", "eowikinews", "eowikiquote", "eowikisource", "eowikivoyage",
    "eowiktionary", "eswiki", "eswikibooks", "eswikinews", "eswikiquote", "eswikisource",
    "eswikiversity", "eswikivoyage", "eswiktionary", "etwiki", "etwikibooks", 
    "etwikimedia", "etwikiquote", "etwikisource", "etwiktionary", "euwiki", "euwikibooks",
    "euwikiquote", "euwikisource", "euwiktionary", "extwiki", "fatwiki", "fawiki",
    "fawikibooks", "fawikinews", "fawikiquote", "fawikisource", "fawikivoyage",
    "fawiktionary", "ffwiki", "fiu_vrowiki", "fiwiki", "fiwikibooks", "fiwikimedia",
    "fiwikinews", "fiwikiquote", "fiwikisource", "fiwikiversity", "fiwikivoyage",
    "fiwiktionary", "fjwiki", "fjwiktionary", "fonwiki", "foundationwiki", "fowiki",
    "fowikisource", "fowiktionary", "frpwiki", "frrwiki", "frwiki", "frwikibooks",
    "frwikinews", "frwikiquote", "frwikisource", "frwikiversity", "frwikivoyage",
    "frwiktionary", "furwiki", "fywiki", "fywikibooks", "fywiktionary", "gagwiki",
    "ganwiki", "gawiki", "gawikibooks", "gawikiquote", "gawiktionary", "gcrwiki",
    "gdwiki", "gdwiktionary", "glkwiki", "glwiki", "glwikibooks", "glwikiquote",
    "glwikisource", "glwiktionary", "gnwiki", "gnwikibooks", "gnwiktionary", 
    "gomwiki", "gomwiktionary", "gorwiki", "gorwiktionary", "gotwiki", "gotwikibooks",
    "gpewiki", "gucwiki", "gurwiki", "guwiki", "guwikibooks", "guwikiquote",
    "guwikisource", "guwiktionary", "guwwiki", "guwwikinews", "guwwikiquote",
    "guwwiktionary", "gvwiki", "gvwiktionary", "hakwiki", "hawiki", "hawiktionary",
    "hawwiki", "hewiki", "hewikibooks", "hewikinews", "hewikiquote", "hewikisource",
    "hewikivoyage", "hewiktionary", "hifwiki", "hifwiktionary", "hiwiki", "hiwikibooks",
    "hiwikimedia", "hiwikiquote", "hiwikisource", "hiwikiversity", "hiwikivoyage",
    "hiwiktionary", "howiki", "hrwiki", "hrwikibooks", "hrwikiquote", "hrwikisource",
    "hrwiktionary", "hsbwiki", "hsbwiktionary", "htwiki", "htwikisource", "huwiki",
    "huwikibooks", "huwikinews", "huwikiquote", "huwikisource", "huwiktionary",
    "hywiki", "hywikibooks", "hywikiquote", "hywikisource", "hywiktionary",
    "hywwiki", "hzwiki", "iawiki", "iawikibooks", "iawiktionary", "idwiki",
    "idwikibooks", "idwikimedia", "idwikiquote", "idwikisource", "idwiktionary",
    "iewiki", "iewikibooks", "iewiktionary", "iglwiki", "igwiki", "igwikiquote",
    "igwiktionary", "iiwiki", "ikwiki", "ikwiktionary", "ilowiki", "incubatorwiki",
    "inhwiki", "iowiki", "iowiktionary", "iswiki", "iswikibooks", "iswikiquote",
    "iswikisource", "iswiktionary", "itwiki", "itwikibooks", "itwikinews", 
    "itwikiquote", "itwikisource", "itwikiversity", "itwikivoyage", "itwiktionary",
    "iuwiki", "iuwiktionary", "jamwiki", "jawiki", "jawikibooks", "jawikinews", 
    "jawikiquote", "jawikisource", "jawikiversity", "jawikivoyage", "jawiktionary",
    "jbowiki", "jbowiktionary", "jvwiki", "jvwikisource", "jvwiktionary", 
    "kaawiki", "kaawiktionary", "kabwiki", "kawiki", "kawikibooks", "kawikiquote",
    "kawiktionary", "kbdwiki", "kbdwiktionary", "kbpwiki", "kcgwiki", "kcgwiktionary",
    "kgwiki", "kiwiki", "kjwiki", "kkwiki", "kkwikibooks", "kkwikiquote", "kkwiktionary",
    "klwiki", "klwiktionary", "kmwiki", "kmwikibooks", "kmwiktionary", "knwiki",
    "knwikibooks", "knwikiquote", "knwikisource", "knwiktionary", "koiwiki",
    "kowiki", "kowikibooks", "kowikinews", "kowikiquote", "kowikisource", 
    "kowikiversity", "kowiktionary", "krcwiki", "krwiki", "krwikiquote",
    "kshwiki", "kswiki", "kswikibooks", "kswikiquote", "kswiktionary", "kuswiki",
    "kuwiki", "kuwikibooks", "kuwikiquote", "kuwiktionary", "kvwiki", "kwwiki",
    "kwwikiquote", "kwwiktionary", "kywiki", "kywikibooks", "kywikiquote",
    "kywiktionary", "labswiki", "ladwiki", "lawiki", "lawikibooks", "lawikiquote",
    "lawikisource", "lawiktionary", "lbewiki", "lbwiki", "lbwikibooks", "lbwikiquote",
    "lbwiktionary", "lezwiki", "lfnwiki", "lgwiki", "lijwiki", "lijwikisource",
    "liwiki", "liwikibooks", "liwikinews", "liwikiquote", "liwikisource", "liwiktionary",
    "lldwiki", "lmowiki", "lmowiktionary", "lnwiki", "lnwikibooks", "lnwiktionary",
    "loginwiki", "lowiki", "lowiktionary", "lrcwiki", "ltgwiki", "ltwiki",
    "ltwikibooks", "ltwikiquote", "ltwikisource", "ltwiktionary", "lvwiki",
    "lvwikibooks", "lvwiktionary", "madwiki", "maiwiki", "maiwikimedia", "map_bmswiki", "mdfwiki", "mediawikiwiki", 
    "metawiki", "mgwiki", "mgwikibooks", "mgwiktionary", "mhrwiki", "mhwiki", 
    "mhwiktionary", "minwiki", "minwiktionary", "miwiki", "miwikibooks", "miwiktionary", 
    "mkwiki", "mkwikibooks", "mkwikimedia", "mkwikisource", "mkwiktionary", "mlwiki", 
    "mlwikibooks", "mlwikiquote", "mlwikisource", "mlwiktionary", "mniwiki", "mniwiktionary", 
    "mnwiki", "mnwikibooks", "mnwiktionary", "mnwwiki", "mnwwiktionary", "mrjwiki", 
    "mrwiki", "mrwikibooks", "mrwikiquote", "mrwikisource", "mrwiktionary", "mswiki", 
    "mswikibooks", "mswikisource", "mswiktionary", "mtwiki", "mtwiktionary", "muswiki", 
    "mwlwiki", "mxwikimedia", "myvwiki", "mywiki", "mywikibooks", "mywiktionary", 
    "mznwiki", "nahwiki", "nahwikibooks", "nahwiktionary", "napwiki", "napwikisource", 
    "nawiki", "nawikibooks", "nawikiquote", "nawiktionary", "nds_nlwiki", "ndswiki", 
    "ndswikibooks", "ndswikiquote", "ndswiktionary", "newiki", "newikibooks", 
    "newiktionary", "newwiki", "ngwiki", "niawiki", "niawiktionary", "nlwiki", 
    "nlwikibooks", "nlwikimedia", "nlwikinews", "nlwikiquote", "nlwikisource", 
    "nlwikivoyage", "nlwiktionary", "nnwiki", "nnwikiquote", "nnwiktionary", 
    "nostalgiawiki", "novwiki", "nowiki", "nowikibooks", "nowikimedia", "nowikinews", 
    "nowikiquote", "nowikisource", "nowiktionary", "nqowiki", "nrmwiki", "nsowiki", 
    "nvwiki", "nycwikimedia", "nywiki", "nzwikimedia", "ocwiki", "ocwikibooks", 
    "ocwiktionary", "olowiki", "omwiki", "omwiktionary", "orwiki", "orwikisource", 
    "orwiktionary", "oswiki", "outreachwiki", "pagwiki", "pamwiki", "papwiki", 
    "pawiki", "pawikibooks", "pawikisource", "pawiktionary", "pcdwiki", "pcmwiki", 
    "pdcwiki", "pflwiki", "pihwiki", "piwiki", "piwiktionary", "plwiki", "plwikibooks", 
    "plwikimedia", "plwikinews", "plwikiquote", "plwikisource", "plwikivoyage", 
    "plwiktionary", "pmswiki", "pmswikisource", "pnbwiki", "pnbwiktionary", "pntwiki", 
    "pswiki", "pswikibooks", "pswikivoyage", "pswiktionary", "ptwiki", "ptwikibooks", 
    "ptwikimedia", "ptwikinews", "ptwikiquote", "ptwikisource", "ptwikiversity", 
    "ptwikivoyage", "ptwiktionary", "pwnwiki", "quwiki", "quwikibooks", "quwikiquote", 
    "quwiktionary", "rmwiki", "rmwikibooks", "rmwiktionary", "rmywiki", "rnwiki", 
    "rnwiktionary", "roa_rupwiki", "roa_rupwiktionary", "roa_tarawiki", "rowiki", 
    "rowikibooks", "rowikinews", "rowikiquote", "rowikisource", "rowikivoyage", 
    "rowiktionary", "rswikimedia", "ruewiki", "ruwiki", "ruwikibooks", "ruwikimedia", 
    "ruwikinews", "ruwikiquote", "ruwikisource", "ruwikiversity", "ruwikivoyage", 
    "ruwiktionary", "rwwiki", "rwwiktionary", "sahwiki", "sahwikiquote", "sahwikisource", 
    "satwiki", "sawiki", "sawikibooks", "sawikiquote", "sawikisource", "sawiktionary", 
    "scnwiki", "scnwiktionary", "scowiki", "scwiki", "scwiktionary", "sdwiki", 
    "sdwikinews", "sdwiktionary", "sewiki", "sewikibooks", "sewikimedia", "sgwiki", 
    "sgwiktionary", "shiwiki", "shnwiki", "shnwikibooks", "shnwikivoyage", 
    "shnwiktionary", "shwiki", "shwiktionary", "shywiktionary", "simplewiki", 
    "simplewikibooks", "simplewikiquote", "simplewiktionary", "siwiki", "siwikibooks", 
    "siwiktionary", "skrwiki", "skrwiktionary", "skwiki", "skwikibooks", "skwikiquote", 
    "skwikisource", "skwiktionary", "slwiki", "slwikibooks", "slwikiquote", 
    "slwikisource", "slwikiversity", "slwiktionary", "smnwiki", "smwiki", "smwiktionary", 
    "snwiki", "snwiktionary", "sourceswiki", "sowiki", "sowiktionary", "specieswiki", 
    "sqwiki", "sqwikibooks", "sqwikinews", "sqwikiquote", "sqwiktionary", "srnwiki", 
    "srwiki", "srwikibooks", "srwikinews", "srwikiquote", "srwikisource", "srwiktionary", 
    "sswiki", "sswiktionary", "stqwiki", "stwiki", "stwiktionary", "suwiki", 
    "suwikibooks", "suwikiquote", "suwikisource", "suwiktionary", "svwiki", 
    "svwikibooks", "svwikinews", "svwikiquote", "svwikisource", "svwikiversity", 
    "svwikivoyage", "svwiktionary", "swwiki", "swwikibooks", "swwiktionary", 
    "szlwiki", "szywiki", "tawiki", "tawikibooks", "tawikinews", "tawikiquote", 
    "tawikisource", "tawiktionary", "taywiki", "tcywiki", "tenwiki", "test2wiki", 
    "testwiki", "testwikidatawiki", "tetwiki", "tewiki", "tewikibooks", "tewikiquote", 
    "tewikisource", "tewiktionary", "tgwiki", "tgwikibooks", "tgwiktionary", 
    "thwiki", "thwikibooks", "thwikinews", "thwikiquote", "thwikisource", "thwiktionary", 
    "tiwiki", "tiwiktionary", "tkwiki", "tkwikibooks", "tkwikiquote", "tkwiktionary", 
    "tlwiki", "tlwikibooks", "tlwikiquote", "tlwiktionary", "tlywiki", "tnwiki", 
    "tnwiktionary", "towiki", "towiktionary", "tpiwiki", "tpiwiktionary", "trvwiki", 
    "trwiki", "trwikibooks", "trwikimedia", "trwikinews", "trwikiquote", "trwikisource", 
    "trwikivoyage", "trwiktionary", "tswiki", "tswiktionary", "ttwiki", "ttwikibooks", 
    "ttwikiquote", "ttwiktionary", "tumwiki", "twwiki", "twwiktionary", "tyvwiki", 
    "tywiki", "uawikimedia", "udmwiki", "ugwiki", "ugwikibooks", "ugwikiquote", 
    "ugwiktionary", "ukwiki", "ukwikibooks", "ukwikinews", "ukwikiquote", "ukwikisource", 
    "ukwikivoyage", "ukwiktionary", "urwiki", "urwikibooks", "urwikiquote", "urwiktionary", 
    "uzwiki", "uzwikibooks", "uzwikiquote", "uzwiktionary", "vecwiki", "vecwikisource", 
    "vecwiktionary", "vepwiki", "vewiki", "viwiki", "viwikibooks", "viwikiquote", 
    "viwikisource", "viwikivoyage", "viwiktionary", "vlswiki", "votewiki", "vowiki", 
    "vowikibooks", "vowikiquote", "vowiktionary", "warwiki", "wawiki", "wawikibooks", 
    "wawikisource", "wawiktionary", "wbwikimedia", "wikidatawiki", "wikifunctionswiki", 
    "wikimania2015wiki", "wikimania2016wiki", "wikimania2017wiki", "wowiki", 
    "wowikiquote", "wowiktionary", "wuuwiki", "xalwiki", "xhwiki", "xhwikibooks", 
    "xhwiktionary", "xmfwiki", "yiwiki", "yiwikisource", "yiwiktionary", "yowiki", 
    "yowikibooks", "yowiktionary", "yuewiktionary", "zawiki", "zawikibooks", "zawikiquote", 
    "zawiktionary", "zeawiki", "zghwiki", "zh_classicalwiki", "zh_min_nanwiki", 
    "zh_min_nanwikibooks", "zh_min_nanwikiquote", "zh_min_nanwikisource", "zh_min_nanwiktionary", 
    "zh_yuewiki", "zhwiki", "zhwikibooks", "zhwikinews", "zhwikiquote", "zhwikisource", 
    "zhwikiversity", "zhwikivoyage", "zhwiktionary", "zuwiki", "zuwikibooks", "zuwiktionary"
]

DUMP = "2024-11"
test_url = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/aawiki/{DUMP}.aawiki.all-time.tsv.bz2"
DUMP_LOC_PREFIX = f"https://dumps.wikimedia.org/other/mediawiki_history/{DUMP}/"
FILE_LOC_PREFIX = "/data/users/mgaughan/mw-repo-lifecycles/wiki_activity_data/compressed_monthly_activity_files/"

YEARS = ['2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024']
MONTHS = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']

def download_file(url):
    print(f"Try to get {url}")
    response = requests.get(url)
    if "content-disposition" in response.headers:
         content_disposition = response.headers["content-disposition"]
         filename = FILE_LOC_PREFIX + content_disposition.split("filename=")[1]
    else:
         filename = FILE_LOC_PREFIX + url.split("/")[-1]
    with open(filename, mode="wb") as file:
         file.write(response.content)
    print(f"Downloaded file {filename}")
    return filename


def batch_for_monthly():
    urls = []
    for entry in MONTHLY_PROJECTS:
        for year in YEARS:
            for month in MONTHS:
                urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.{year}-{month}.tsv.bz2")
    for url in urls:
        try:
            download_file(url)
        except Exception:
            print(f"error! {url}")

def batch_for_yearly():
    urls = []
    for entry in YEARLY_PROJECTS:
        for year in YEARS:
           urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.{year}.tsv.bz2")
    for url in urls:
        try:
            download_file(url)
        except Exception:
            print(f"error! {url}")

def batch_parallel_for_single():
    urls = []
    for entry in ALL_PROJECTS:
        if entry not in YEARLY_PROJECTS and entry not in MONTHLY_PROJECTS:
            urls.append(f"{DUMP_LOC_PREFIX}{entry}/{DUMP}.{entry}.all-time.tsv.bz2")
    for url in urls:
        download_file(url)
    '''
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        future_to_filepath = {executor.submit(download_file, url): url for url in urls}
        for future in concurrent.futures.as_completed(future_to_filepath):
            filepath = future_to_filepath[future]
        try:
            data = future
        except KeyboardInterrupt:
            print("Keyboard interrupt received, shutting down executor")
            executor.shutdown(wait=False, cancel_futures=True)
        except Exception as exc:
            print('generated an exception: %s' % (exc))
    '''

if __name__ == "__main__":
    batch_for_monthly()
