# /// script
# dependencies = [
#   "requests",
#   "bs4"
# ]
# ///
from requests import get, session
from os import makedirs, environ
from os.path import exists, dirname
from bs4 import BeautifulSoup
from getpass import getpass
site="https://audiovault.net"
session=session()

def login(email,password):
    loginpage = session.get(site+"/login")
    loginpage.raise_for_status()
    loginsoup = BeautifulSoup(loginpage.text, features="html.parser")
    token = loginsoup.find("input", {"type": "hidden", "name": "_token"})
    token = token.get("value")
    loginsession = session.post(site+"/login", {
        "_token": token,
        "email": email,
        "password": password,
        })
    if(validatelogin(session)):
        return True
    else:
        print("login incorrect")
        exit(4)

def validatelogin(session=session):
    page=session.get(f'{site}').content
    document=BeautifulSoup(page,features="html.parser")
    for i in document.find_all("a"):
        if(i.get("href").__contains__("upload")):
            return True
            break
        else:
            continue
    return False

def searchforlogin(session=session):
    email=environ.get("avemail")
    if(not email) or (email==""):
        print("enter email:")
        email=input()
    password=environ.get("avpassword")
    if((not password) or (password=="")):
        password=getpass(prompt="enter password:")
    login(email,password)

searchforlogin()
type="movies"
path="/"+type+"?page=1"
items=[]
headers=[]


def process(site=site,path=path,id="search_by_id",name="search_by_name"):
    items.clear()
    print("processing"+path)
    page=session.get(f'{site}{path}').content
    document=BeautifulSoup(page,features="html.parser")
    tables=document.find_all("table")
    for i in tables:
        try:
            i.get_text().replace("\n","")
        except ValueError:
            pass
    header_elem=document.find_all("th")
    for i in header_elem:
        try:
            headers.append(i.get_text().replace("\n","").replace("Download","").replace("   ",""))
        except ValueError:
            pass
    table_item=document.find_all("tr")
    ctr=0
    while(ctr<=len(table_item)):
                try:
                    for element in table_item[ctr].find_all():
                        if(element.find_all("a")):
                            items.append(element.find_all("a")[0].get("href"))
                        else:
                            items.append(element.get_text().replace("\n","").replace("Download","").replace("   ",""))
                except IndexError:
                    pass
                ctr=ctr+1
    for i in headers:
        try:
            items.remove(i)
        except ValueError:
            pass
    for i in items:
        try:
            items.remove(" ")
        except ValueError:
            pass
    for i in document.find_all("a"):
        if(i.has_attr("rel")):
            if((i.get("rel")).__contains__("next")):
                path=i.get("href").replace(site,"")
                search(id=id,name=name)
                process(site,path,name=name,id=id)
        else:
            pass

def downloadall():
    ctr=0
    max=(len(items)-1)
    while(ctr<=max):
        download(items[ctr],items[(ctr+1)],items[ctr+2],type=type)
        ctr=ctr+3

def search(id="search_by_id",name="search_by_name"):
    if((id=="all") or (name=="all")):
        downloadall()
        return True
    if((id=="search_by_id") and (name=="search_by_name")):
        return False
    else:
        ctr=0
        max=(len(items)-1)
        while(ctr<=max):
            if((items[ctr].__contains__(id)) or (items[(ctr+1)].__contains__(name))):
                download(items[ctr],items[(ctr+1)],items[ctr+2])
                ctr=ctr+3
            else:
                ctr=ctr+3
                continue

def download(id,name,url,type=type):
    sanatized_file=name.replace("(","").replace(")","").replace("/","").replace("[","").replace("]","").replace("\n","").replace("  "," ").replace("'","").replace("\"","").replace("\r","").strip()
    match(type):
        case "movies":
            ext=".mp3"
        case "shows":
            ext=".zip"
    file=type+"/"+sanatized_file+"/"+sanatized_file+"_"+id+ext
    filedir=dirname(file)
    if(exists(file)):
        print(file+" already exists, skipping.")
        return True
    else:
        if(exists(filedir)):
            pass
        else:
            print("Making directory "+filedir)
            makedirs(filedir)
            print("Downloading "+name)
            f=open(file,"wb")
            f.write(session.get(url).content)
            f.close()

while True:
    print("c: Change type, "+type+" selected\ni: search by id\nn: search by name\nall for all")
    scope=input()
    match(scope):
        case "c":
            while True:
                print("select type: \nm: movies\ns: shows")
                reqtype=input()
                match(reqtype):
                        case "m":
                            type="movies"
                            path="/"+type
                            break
                        case "s":
                            type="shows"
                            path="/"+type
                            break
                        case "default":
                            continue
        case "i":
            print("enter id")
            id=input()
            name="search_by_name"
            break
        case "n":
            print("enter name")
            id="search_by_id"
            name=input()
            break
        case "all":
            id="all"
            name="all"
            break
        case Default:
            continue
process(site,path,name=name,id=id)
