from pathlib import Path
import csv
from collections import Counter


def scan_folder(folder: Path):
    files = [path for path in folder.rglob("*") if path.is_file()]
    by_extension = Counter(path.suffix.lower() or "[no extension]" for path in files)
    by_folder = Counter(str(path.parent.relative_to(folder)) or "." for path in files)
    total_size = sum(path.stat().st_size for path in files)
    return files, by_extension, by_folder, total_size


def write_report(folder: Path, output: Path):
    files, by_extension, by_folder, total_size = scan_folder(folder)

    with output.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.writer(handle)
        writer.writerow(["Folder report"])
        writer.writerow(["Scanned folder", str(folder)])
        writer.writerow(["Total files", len(files)])
        writer.writerow(["Total size MB", round(total_size / (1024 * 1024), 2)])
        writer.writerow([])

        writer.writerow(["Files by extension"])
        writer.writerow(["Extension", "Count"])
        for extension, count in by_extension.most_common():
            writer.writerow([extension, count])
        writer.writerow([])

        writer.writerow(["Files by folder"])
        writer.writerow(["Folder", "Count"])
        for folder_name, count in by_folder.most_common():
            writer.writerow([folder_name, count])


if __name__ == "__main__":
    target = Path.cwd()
    output_file = target / "folder_report.csv"
    write_report(target, output_file)
    print(f"Created {output_file}")
