#! /usr/bin/env python
from __future__ import print_function
import os
from abjad.tools import systemtools


def fix_test_case_names():
    total_test_modules = 0
    total_test_cases = 0
    total_nonmatching_names = 0
    for directory, subdirectory_names, file_names in os.walk('.'):
        test_modules = []
        for file_name in file_names:
            if file_name.startswith('test_') and file_name.endswith('.py'):
                test_modules.append(file_name)
        total_test_modules += len(test_modules)
        for test_module in test_modules:
            result = process_test_module_name_fixes(
                test_module, directory)
            total_test_cases_in_module, total_nonmatching_names_in_module = \
                result
            total_test_cases += total_test_cases_in_module
            total_nonmatching_names += total_nonmatching_names_in_module
    print('Total test modules: {}'.format(total_test_modules))
    print('Total test cases:   {}'.format(total_test_cases))
    if total_nonmatching_names == 1:
        suffix = ''
    else:
        suffix = 's'
    print('Total misnamed test case name{}: {}'.format(
        suffix, total_nonmatching_names))


def process_test_module_name_fixes(test_module, directory):
    total_nonmatching_names_in_current_module = 0
    test_cases_in_current_module = 0
    full_module_name = os.path.join(directory, test_module)
    short_module_name = test_module[:-3]
    desired_test_case_prefix = short_module_name
    new_lines = []
    with open(full_module_name, 'r') as file_pointer:
        lines = file_pointer.readlines()
    for line in lines:
        if line.startswith('def test') or line.startswith('#def test'):
            test_cases_in_current_module += 1

            # TODO: replace with regex
            test_case_name = line.strip()
            if test_case_name.startswith('#'):
                test_case_name = test_case_name[1:]
            test_case_name = test_case_name.split('def ')[1]
            test_case_name = test_case_name.split('(')[0]

            # TODO: replace with regex
            actual_test_case_prefix = line.strip()
            if actual_test_case_prefix.startswith('#'):
                actual_test_case_prefix = actual_test_case_prefix[1:]
            actual_test_case_prefix = actual_test_case_prefix.split('def ')[1]
            actual_test_case_prefix = actual_test_case_prefix.split('(')[0]
            actual_test_case_prefix = actual_test_case_prefix[:-3]

            if not actual_test_case_prefix == desired_test_case_prefix:
                total_nonmatching_names_in_current_module += 1
                print('NONMATCHING in {}'.format(test_module))
                new_line = line.replace(
                    actual_test_case_prefix, desired_test_case_prefix)
                print('OLD LINE:  {}'.format(line.strip('\n')))
                print('NEW LINE:  {}'.format(new_line.strip('\n')))
                choice = 'y'
                if choice.lower() == 'y':
                    new_lines.append(new_line)
                else:
                    new_lines.append(line)
                print()
            else:
                new_lines.append(line)
        else:
            new_lines.append(line)
    with open(full_module_name, 'w') as file_pointer:
        file_pointer.writelines(new_lines)
    return (
        test_cases_in_current_module, 
        total_nonmatching_names_in_current_module,
        )


def fix_test_case_numbers():
    total_test_modules = 0
    total_test_cases = 0
    total_misnumbered_cases = 0
    for directory, subdirectory_names, file_names in os.walk('.'):
        test_modules = []
        for file_name in file_names:
            if file_name.startswith('test_') and file_name.endswith('.py'):
                test_modules.append(file_name)
        total_test_modules += len(test_modules)
        for test_module in test_modules:
            result = process_test_module_number_fixes(
                test_module, directory)
            test_cases_in_current_module = result[0]
            misnumbered_cases_in_current_module = result[1]
            total_test_cases += test_cases_in_current_module
            total_misnumbered_cases += misnumbered_cases_in_current_module
    print('Total test modules: {}'.format(total_test_modules))
    print('Total test cases:   {}'.format(total_test_cases))
    if total_misnumbered_cases == 1:
        suffix = ''
    else:
        suffix = 's'
    print('Total misnumbered test case name{}: {}'.format(
        suffix, total_misnumbered_cases))


def process_test_module_number_fixes(test_module, directory):
    test_cases_in_current_module = 0
    misnumbered_cases_in_current_module = 0
    full_module_name = os.path.join(directory, test_module)
    short_module_name = test_module[:-3]
    desired_test_case_prefix = short_module_name
    new_lines = []
    with open(full_module_name, 'r') as file_pointer:
        lines = file_pointer.readlines()
    current_case_number = 1
    for line in lines:
        if line.startswith('def test') or line.startswith('#def test'):
            test_cases_in_current_module += 1
            desired_test_case_number = str(current_case_number).zfill(2)

            # TODO: replace with regex
            actual_test_case_number = line.split('(')[0]
            actual_test_case_number = actual_test_case_number[-2:]

            if not actual_test_case_number == desired_test_case_number:
                misnumbered_cases_in_current_module += 1
                print('NONMATCHING in {}'.format(test_module))
                new_line = line.replace(
                    actual_test_case_number, desired_test_case_number)
                print('OLD LINE:  {}'.format(line.strip('\n')))
                print('NEW LINE:  {}'.format(new_line.strip('\n')))
                choice = 'y'
                if choice.lower() == 'y':
                    new_lines.append(new_line)
                else:
                    new_lines.append(line)
                print()
            else:
                new_lines.append(line)
            current_case_number += 1
        else:
            new_lines.append(line)
    with open(full_module_name, 'w') as file_pointer:
        file_pointer.writelines(new_lines)
    return test_cases_in_current_module, misnumbered_cases_in_current_module


if __name__ == '__main__':
    systemtools.IOManager.clear_terminal()
    fix_test_case_names()
    print()
    fix_test_case_numbers()
    print()