import os
import argparse
import requests
import base64

def find_pdb_files(source_dir):
    pdb_files = []
    for root, _, files in os.walk(source_dir):
        for file in files:
            if file.endswith(".pdb"):
                absolute_path = os.path.join(root, file)
                pdb_files.append(absolute_path)
    return pdb_files

def upload_to_nexus(file_path, source_dir, nexus_url, repository, target_dir, nexus_user, nexus_password):
    file_name = os.path.basename(file_path)
    new_file_name = f"{os.path.splitext(file_name)[0]}.pdb"
    upload_url = f"{nexus_url}/service/rest/v1/components?repository={repository}"
    relative_path = os.path.relpath(os.path.dirname(file_path), source_dir)
    target_path = os.path.join(target_dir, relative_path).replace("\\", "/")
    
    files = {
        'raw.directory': (None, target_path),
        'raw.asset1': (new_file_name, open(file_path, 'rb')),
        'raw.asset1.filename': (None, new_file_name)
    }

    auth = base64.b64encode(f"{nexus_user}:{nexus_password}".encode()).decode()
    headers = {
        'accept': 'application/json',
        'Authorization': f'Basic {auth}'
    }

    print(f"Uploading {file_path} as {new_file_name} to {upload_url}")
    response = requests.post(upload_url, files=files, headers=headers)
    print(f"Response: {response.status_code}")
    print(f"Response Text: {response.text}")
    return response

def main():
    parser = argparse.ArgumentParser(description='Find .pdb files and upload to Nexus repository.')
    parser.add_argument('--source_dir', required=True, help='Source directory to search for .pdb files')
    parser.add_argument('--nexus_url', default='https://nexus.perimeter81.com', help='Nexus repository URL')
    parser.add_argument('--nexus_repo_name', default='windows-symbolstore', help='Nexus repository name')
    parser.add_argument('--nexus_target_dir', required=True, help='Target directory in Nexus repository')

    args = parser.parse_args()

    source_dir = args.source_dir
    nexus_url = args.nexus_url
    nexus_repo_name = args.nexus_repo_name
    nexus_target_dir = args.nexus_target_dir
    nexus_user = os.getenv('NEXUS_USERNAME')
    nexus_password = os.getenv('NEXUS_PASSWORD')

    if not nexus_user or not nexus_password:
        print("Nexus username or password not set in environment variables.")
        return

    pdb_files = find_pdb_files(source_dir)
    if not pdb_files:
        print("No .pdb files found in the source directory.")
        return

    for pdb_file in pdb_files:
        response = upload_to_nexus(pdb_file, source_dir, nexus_url, nexus_repo_name, nexus_target_dir, nexus_user, nexus_password)
        relative_path = os.path.relpath(os.path.dirname(pdb_file), source_dir)
        target_path = f"{nexus_target_dir}/{relative_path}/{os.path.basename(pdb_file)}"
        if response.status_code == 204:
            print(f"Successfully uploaded: {pdb_file} to {nexus_repo_name}/{target_path}")
        else:
            print(f"Failed to upload: {pdb_file}. Status code: {response.status_code}")
            print(f"Response Text: {response.text}")

if __name__ == "__main__":
    main()
