#!/usr/bin/env python3
"""Backup script that creates a zip file containing all .txt files from a source directory."""

import os
import sys
import zipfile
from pathlib import Path

try:
    from tqdm import tqdm
except ImportError:
    print("Installing tqdm for progress bar...")
    import subprocess
    subprocess.check_call([sys.executable, "-m", "pip", "install", "tqdm"])
    from tqdm import tqdm


def backup_txt_files(source_dir, output_zip=None):
    source_path = Path(source_dir).resolve()
    if not source_path.is_dir():
        print(f"Error: Source directory '{source_dir}' does not exist.")
        return False

    if output_zip is None:
        output_dir = Path.home() / "Downloads"
        output_zip = output_dir / "importantstuff.zip"
    output_path = Path(output_zip).resolve()

    txt_files = list(source_path.rglob("*.txt"))
    if not txt_files:
        print("No .txt files found in the source directory.")
        return False

    print(f"Found {len(txt_files)} .txt file(s) to back up.")
    print(f"Source: {source_path}")
    print(f"Output: {output_path}")

    with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zf:
        for txt_file in tqdm(txt_files, desc="Backing up", unit="file"):
            arcname = txt_file.relative_to(source_path)
            zf.write(txt_file, arcname)

    print(f"\nBackup complete! {len(txt_files)} file(s) compressed to:")
    print(f"  {output_path}")
    print(f"  Size: {output_path.stat().st_size / 1024:.2f} KB")
    return True


def main():
    if len(sys.argv) < 2:
        print("Usage: python backup_txt_files.py <source_directory> [output_zip_file]")
        print("\nExample:")
        print("  python backup_txt_files.py C:\\Users\\Documents")
        print("  python backup_txt_files.py C:\\Users\\Documents my_backup.zip")
        return

    source_dir = sys.argv[1]
    output_zip = sys.argv[2] if len(sys.argv) > 2 else None

    backup_txt_files(source_dir, output_zip)


if __name__ == "__main__":
    main()