import glob
import operator

# 조사할 디렉토리 경로
ROOT_DIR = './'

# 조사할 확장자 목록
extensions = [
    '*.py',
    '*.java',
    '*.py',
    '*.js',
    '*.cs',
    '*.css',
    '*.Rmd'
]

# 무시할 디렉토리 경로 목록
ignore_paths = ['node_modules', 'Creeper-Seeker','3D-Models','AdGuard-Filter','Build-Archive','DB','public','build','.git','ftc_app_1920_New','HawksNestWebsocketAPI','i_want_go_home','PixelLabyrinth','Poster-Dark','yukinosaika.github.io']




# 무시할 파일 목록
ignore_files = [
    'NanumGothic.css',
    'Designer.cs',
    '*.Designer.cs'
]

total_line_count = 0
total_file_count = 0
files_grabbed = []


# dictionary 를 value 기준으로 정렬된 tuple 로 변환
def dict_to_sorted_by_val(tmp_dict, reverse=False):
    return sorted(tmp_dict.items(), key=operator.itemgetter(1), reverse=reverse)


# 카운트 함수
def start_count():
    try:
        global total_line_count, total_file_count
        line_count_dict = dict()
        extension_count_dict = dict.fromkeys(extensions, 0)

        # 설정한 확장자가 포함된 파일 리스트 생성
        [files_grabbed.extend(glob.glob(f'{ROOT_DIR}/**/{extension}', recursive=True)) for extension in extensions]

        # 파일별로 라인수, 확장자별 갯수, 라인총합, 확장자별 갯수 총합 구함
        for file_name_with_path in files_grabbed:
            file_name = file_name_with_path.split('/')[-1]
            ext = file_name.split('.')[-1]
            if file_name in ignore_files:
                continue

            is_ignored = False
            for ignore_path in ignore_paths:
                if file_name_with_path.find(ignore_path) != -1:
                    is_ignored = True
                    break

            if is_ignored:
                continue

            try:
                extension_count_dict['*.' + ext] += 1


                line_count = sum(1 for line in open(file_name_with_path, encoding='ISO-8859-1'))
                line_count_dict[file_name_with_path] = line_count
            except:
                pass

            total_line_count += line_count
            total_file_count += 1
            print(total_line_count)

        # reverse=True 면 value 기준으로 내림차순 정렬
        sorted_line_count = dict_to_sorted_by_val(line_count_dict, reverse=True)
        sorted_file_count = dict_to_sorted_by_val(extension_count_dict, reverse=True)
        return sorted_line_count, sorted_file_count
    except:
        pass


# 카운트 함수 실행
line_count, file_count = start_count()

# 출력
for result in line_count:
    file = result[0]
    count = result[1]
    print('{:>4} {:<0}'.format(count, file))

print('\n지정한 확장자별 파일 개수')
for result in file_count:
    file = result[0]
    count = result[1]
    print('{:<7} {:>3} 개'.format(file, count))

print(f'\n프로젝트 전체 파일 수: {total_file_count} 개')
print(f'프로젝트 전체 코드 라인 수: {total_line_count} 줄\n')