#!/usr/bin/env python3

import argparse
import os
import sys

import checksymbolslib.file as file
from checksymbolslib.db import DB


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--search', action='store', default=None,
                        help='print all symbols matching a given regular expression')
    return parser.parse_args()


def change_to_top_dir():
    base_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
    os.chdir(base_dir)


def get_full_db(files_to_process):
    db = DB()
    for f in files_to_process:
        file.populate_db_from_file(db, f)
    return db


def print_filenames_with_pattern(all_files, files_to_process, pattern):
    ignored_filenames = file.get_list_of_filenames_with_pattern(all_files, files_to_process, pattern)
    processed_filenames = file.get_list_of_filenames_with_pattern(files_to_process, [], pattern)
    print('========== filenames found with pattern "{}": {}'.format(pattern, len(processed_filenames)))
    for f in processed_filenames:
        print(f)
    print('========== ignored filenames with pattern "{}": {}'.format(pattern, len(ignored_filenames)))
    for f in ignored_filenames:
        print(f)


def print_symbols_with_pattern(db, pattern):
    symbols = db.get_symbols_with_pattern(pattern)
    print('========== symbols with pattern "{}": {}'.format(pattern, len(symbols)))
    for s in symbols:
        print(s, str(symbols[s]))


def __main__():
    flags = parse_args()

    change_to_top_dir()
    all_files = file.get_list_of_files_in_the_repo()
    files_to_process = file.get_list_of_files_to_process(all_files)
    db = get_full_db(files_to_process)

    if flags.search:
        print_filenames_with_pattern(all_files, files_to_process, flags.search)
        print_symbols_with_pattern(db, flags.search)
        print('========== warnings:')

    warnings = []
    warnings += db.get_warnings_for_choices_selected()
    warnings += db.get_warnings_for_legacy_symbols_being_defined()
    warnings += db.get_warnings_for_legacy_symbols_being_used()
    warnings += db.get_warnings_for_symbols_with_legacy_note_and_no_comment_on_usage()
    warnings += db.get_warnings_for_symbols_with_legacy_note_and_no_usage()
    warnings += db.get_warnings_for_symbols_without_definition()
    warnings += db.get_warnings_for_symbols_without_usage()

    for filename, lineno, msg in sorted(warnings):
        print('{}:{}: {}'.format(filename, lineno, msg), file=sys.stderr)

    if len(warnings) > 0:
        sys.exit(1)


if __name__ == '__main__':
    __main__()