import os
import codecs
import config.env as env

def has_allowed_extension(name, allowed_file_endings=None):
  if not allowed_file_endings: return True
  
  for file_ending in allowed_file_endings:
    if name.endswith(file_ending):
      return True

  return False

def collect_nested_files(directory_path, forbidden_dir_names=None, allowed_file_endings=None, collected_paths=None):
  if not forbidden_dir_names: forbidden_dir_names = ['env', '.git', '__pycache__', 'server']
  if not allowed_file_endings: allowed_file_endings = ['.md']
  if not collected_paths: collected_paths = []

  print(directory_path)
  if any(name in directory_path.split('\\') + directory_path.split('/') for name in forbidden_dir_names): return
  collected_paths = ((directory_path, []))
  subpaths = collected_paths[1]

  nested_list = sorted(os.listdir(directory_path))

  for name in nested_list:
    nested_path = os.path.join(directory_path, name)
    if os.path.isdir(nested_path):
      nested_dir = collect_nested_files(nested_path, collected_paths=subpaths)
      if nested_dir: 
        subpaths.append(nested_dir)
    else:
      if not has_allowed_extension(name, allowed_file_endings=allowed_file_endings): continue
      subpaths.append(nested_path)
  
  return collected_paths

def read_file(file_path):
  with codecs.open(
    os.path.join(env.working_dir, file_path),
    encoding=env.encoding,
    mode='r'
  ) as file:
    return file.read()

def write_file(file_path, content, create_dirs=True):
  if create_dirs:
    os.makedirs(os.path.dirname(file_path), exist_ok=True)
  with codecs.open(
    os.path.join(env.working_dir, file_path),
    encoding=env.encoding,
    mode='w+'
  ) as file:
    return file.write(content)