import os.path
import sys
from pydevd_constants import Null


#=======================================================================================================================
# GetCoverageFiles
#=======================================================================================================================
def GetCoverageFiles(coverage_output_dir, number_of_files):
    base_dir = coverage_output_dir
    ret = []
    i = 0
    while len(ret) < number_of_files:
        while True:
            f = os.path.join(base_dir, '.coverage.%s' % i)
            i += 1
            if not os.path.exists(f):
                ret.append(f)
                break #Break only inner for.
    return ret


#=======================================================================================================================
# StartCoverageSupport
#=======================================================================================================================
def StartCoverageSupport(configuration):
    return StartCoverageSupportFromParams(
        configuration.coverage_output_dir, 
        configuration.coverage_output_file, 
        configuration.jobs, 
        configuration.coverage_include, 
    )
    

#=======================================================================================================================
# StartCoverageSupportFromParams
#=======================================================================================================================
def StartCoverageSupportFromParams(coverage_output_dir, coverage_output_file, jobs, coverage_include):
    coverage_files = []
    coverage_instance = Null()
    if coverage_output_dir or coverage_output_file:
        try:
            import coverage #@UnresolvedImport
        except:
            sys.stderr.write('Error: coverage module could not be imported\n')
            sys.stderr.write('Please make sure that the coverage module (http://nedbatchelder.com/code/coverage/)\n')
            sys.stderr.write('is properly installed in your interpreter: %s\n' % (sys.executable,))
            
            import traceback;traceback.print_exc()
        else:
            if coverage_output_dir:
                if not os.path.exists(coverage_output_dir):
                    sys.stderr.write('Error: directory for coverage output (%s) does not exist.\n' % (coverage_output_dir,))
                    
                elif not os.path.isdir(coverage_output_dir):
                    sys.stderr.write('Error: expected (%s) to be a directory.\n' % (coverage_output_dir,))
                    
                else:
                    n = jobs
                    if n <= 0:
                        n += 1
                    n += 1 #Add 1 more for the current process (which will do the initial import).
                    coverage_files = GetCoverageFiles(coverage_output_dir, n)
                    os.environ['COVERAGE_FILE'] = coverage_files.pop(0)
                    
                    coverage_instance = coverage.coverage(source=[coverage_include])
                    coverage_instance.start()
                    
            elif coverage_output_file:
                #Client of parallel run.
                os.environ['COVERAGE_FILE'] = coverage_output_file
                coverage_instance = coverage.coverage(source=[coverage_include])
                coverage_instance.start()
                
    return coverage_files, coverage_instance

