#!/usr/bin/env python3
# /// script
# dependencies = [
#   "fitparse",
# ]
# ///

import os
import shutil
import sys
from fitparse import FitFile
from pathlib import Path

def get_device_serial(fit_file_path):
    fitfile = FitFile(str(fit_file_path))

    for message_type in ['device_info', 'file_id']:
        for record in fitfile.get_messages(message_type):
            serial = record.get_value('serial_number')
            if serial is not None:
                return str(serial)

    return None

def split_by_device_serial(directory='.'):
    fit_files = list(Path(directory).glob('*.fit'))

    device_files = {}  # serial -> list of files
    unknown_files = []

    for fit_file in fit_files:
        serial = get_device_serial(fit_file)

        if serial:
            if serial not in device_files:
                device_files[serial] = []
            device_files[serial].append(fit_file)
        else:
            unknown_files.append(fit_file)

    base_dir = Path(directory)
    moved_count = 0

    for serial, files in device_files.items():
        folder_name = f"device_{serial}"
        folder_path = base_dir / folder_name

        folder_path.mkdir(exist_ok=True)
        print(f"\n{folder_name} - {len(files)} file(s)")

        for fit_file in files:
            target_path = folder_path / fit_file.name

            if target_path.exists():
                print(f"ERROR: {fit_file.name} - already exists in target folder")
            else:
                shutil.move(str(fit_file), str(target_path))
                moved_count += 1

    if unknown_files:
        print(f"\nFiles with unknown serial ({len(unknown_files)}):")
        for fit_file in unknown_files:
            print(f"  - {fit_file.name}")

    print("\n" + "="*50)
    print(f"Summary:")
    print(f"  Devices found: {len(device_files)}")
    print(f"  Files moved: {moved_count}")
    print(f"  Files with no serial number: {len(unknown_files)}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <directory>")
        sys.exit(1)
    split_by_device_serial(sys.argv[1])
