#!/usr/bin/env python
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import subprocess
import sys

import helpers as tools
import multithreaded_processor


# output location - temporary directory with all downloaded PPD files
path_dir = 'ppds_all'

# output location - name of the resultant archive with PPD files
path_archive = 'ppds_all.tar.xz'

# list of PPD files
ppd_files = []


def download_PPD(ppd_id):
    """
    Downloads given PPD file and save it to the directory given in path_dir.

    @param ppd_id: an index of the PPD filename in the list ppd_files

    """
    ppd_file = ppd_files[ppd_id]
    ppd = tools.download_PPD_file(ppd_file)
    path_ppd = os.path.join(path_dir, ppd_file)
    with open(path_ppd, 'wb') as file_out:
        file_out.write(ppd)


def main():
    """
    Downloads all available PPD files and creates and archive.

    See readme.txt for more details.

    """
    global path_dir
    global path_archive
    global ppd_files

    if os.path.exists(path_dir) or os.path.exists(path_archive):
        print ( 'Error: The file/directory "%s" or "%s" already exists. Delete'
                ' or move them and run this script again.' % (path_dir,
                path_archive) )
        sys.exit(1)

    # This object is used for running tasks in many threads simultaneously
    processor = multithreaded_processor.MultithreadedProcessor(10)

    # Downloads and extracts PPD filenames from all 20 index files (in parallel)
    outputs = processor.run(tools.get_filenames_from_PPD_index, 20)
    # joins obtained lists and performs deduplication
    set_ppd_files = set()
    for output in outputs:
        set_ppd_files.update(output)
    ppd_files = list(set_ppd_files)

    # Creates an output directory and downloads all PPD files there
    subprocess.call(['mkdir', path_dir])
    processor.run(download_PPD, len(ppd_files))

    # Creates the final archive
    subprocess.call(['tar', 'cJf', path_archive, path_dir])


if __name__ == '__main__':
    main()
