import os
from datetime import datetime
import time
import re, json
from gitmanip import Project

def process_not_found(_, **kwargs):
    return []

def process_pagan_nightly(project_name, **kwargs):
    releases_path = "/srv/http/content/release/pagan_nightly"
    output = []
    for file_name in os.listdir(releases_path):
        if not file_name.endswith(".apk"): continue
        if file_name == "latest.apk": continue

        file_path = f"{releases_path}/{file_name}"
        version_code = file_path[file_path.find(".") + 1 : file_path.rfind(".apk")]

        s = os.stat(file_path)
        time_stamp = max(s.st_mtime, s.st_ctime)
        
        output.append({
            "version_name": file_name[0:file_name.rfind(".apk")],
            "version_code": version_code,
            "timestamp": datetime.fromtimestamp(time_stamp).isoformat(),
            "changelog": "nightly - check git logs for changes",
            "apk": f"/content/release/pagan_nightly/{file_name}"
        })

    output = sorted(output, key=lambda entry: entry["timestamp"], reverse=True) 
    return output

def process_android(project_name, **kwargs):
    project = Project(f"/srv/git/{project_name}")
    project_branch = project.get_branch("master")
    tags = project.get_tags()
    output = []
    version_code_patt = re.compile(r"versionCode\s(?P<versionCode>\d*)", re.S)
    for tag in tags:
        commit_id = project.get_tag_commit(tag).strip()
        gradle_content = project_branch.get_file_content(
            "app/build.gradle",
            commit_id
        )
        version_code = None
        for hit in version_code_patt.finditer(gradle_content):
            version_code = hit.group("versionCode")
            break

        if not version_code:
            continue

        commit = project_branch.get_commit(commit_id)

        if commit is None:
            continue
        try:
            changelog = project_branch.get_file_content(f"fastlane/metadata/android/en-US/changelogs/{version_code}.txt")
        except FileNotFoundError as e:
            changelog = ""
        entry = {
            "version_name": tag,
            "version_code": version_code,
            "timestamp": commit.date.isoformat(),
            "commit": commit_id,
            "changelog": changelog
        }

        if os.path.exists(f"/srv/http/content/release/{project_name}/{project_name}-{tag}.apk"):
            entry["apk"] = f"/content/release/{project_name}/{project_name}-{tag}.apk"

        output.append(entry)

    output = sorted(output, key=lambda entry: entry["timestamp"], reverse=True) 
    # -------------------------------------------- #

    return output

PROJECTS = {
    "pagan": process_android,
    "pagan_nightly": process_pagan_nightly
}

def process_request(**kwargs):
    project_name = kwargs.get('project', None)
    return PROJECTS.get(project_name, process_not_found)(project_name, **kwargs)
