#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Synology Python 3.9: move videos missing language OR quality in filename."""
import argparse
import os
import re
import sys
from pathlib import Path

SOURCE = Path('/volume1/web/videa/Filmy')
DEST = Path('/volume1/web/videa/prejmenovani')
VIDEO_EXT = {'.mp4', '.mkv', '.avi', '.mov', '.wmv', '.m4v', '.webm', '.mpg', '.mpeg', '.ts', '.m2ts', '.flv', '.3gp'}
# Recognize standalone language labels, not fragments of film titles.
LANGUAGE = re.compile(r'(?<![a-z0-9])(?:cz|cze|cs|sk|svk|en|eng|de|ger|fr|fra|es|spa|pl|pol|ru|rus|original)(?![a-z0-9])', re.I)
QUALITY = re.compile(r'(?<![a-z0-9])(?:2160p|1440p|1080p|720p|576p|480p|360p|4k|uhd|fhd|full[ ._-]?hd|hd|sd|dvd|bluray|blu[ ._-]?ray)(?![a-z0-9])', re.I)


def main():
    ap = argparse.ArgumentParser(description='Přesun videí bez jazyka NEBO bez kvality v názvu.')
    ap.add_argument('--apply', action='store_true', help='Provést přesun po potvrzení ano')
    args = ap.parse_args()
    if not SOURCE.is_dir():
        print('CHYBA: Zdrojová složka neexistuje:', SOURCE)
        return 1
    if DEST.exists() and not DEST.is_dir():
        print('CHYBA: Cíl existuje, ale není složka:', DEST)
        return 1
    selected = []
    for p in sorted(SOURCE.iterdir(), key=lambda x: x.name.casefold()):
        if not p.is_file() or p.suffix.lower() not in VIDEO_EXT:
            continue
        stem = p.stem
        no_lang = not bool(LANGUAGE.search(stem))
        no_quality = not bool(QUALITY.search(stem))
        if no_lang or no_quality:
            reason = ('chybí jazyk i kvalita' if no_lang and no_quality else
                      'chybí jazyk' if no_lang else 'chybí kvalita')
            selected.append((p, reason))
    print('Zdroj:', SOURCE)
    print('Cíl:  ', DEST)
    print('Podmínka: chybí jazyk NEBO chybí kvalita (pouze podle názvu).')
    print('Vybráno:', len(selected), 'video souborů\n')
    for i, (p, reason) in enumerate(selected, 1):
        target = DEST / p.name
        conflict = ' [KOLIZE: cíl již existuje]' if target.exists() else ''
        print('%3d. %s -> %s%s' % (i, p.name, reason, conflict))
    if not args.apply:
        print('\nNÁHLED: nic nebylo přesunuto. Pro provedení přidej --apply.')
        return 0
    if not selected:
        print('Není co přesouvat.')
        return 0
    confirm = input('\nProvést přesun? Napiš ano: ').strip().lower()
    if confirm != 'ano':
        print('Zrušeno, nic se neměnilo.')
        return 0
    DEST.mkdir(parents=True, exist_ok=True)
    moved = 0
    skipped = 0
    for src, _ in selected:
        dst = DEST / src.name
        if not src.is_file() or dst.exists():
            print('PŘESKOČENO (zdroj chybí nebo cíl existuje):', src.name)
            skipped += 1
            continue
        try:
            # Exclusive creation: os.link never overwrites an existing target.
            os.link(str(src), str(dst))
            try:
                os.unlink(str(src))
            except OSError as exc:
                print('POZOR: Cíl vytvořen, ale původní název zůstal:', src.name, exc)
                skipped += 1
                continue
            print('PŘESUNUTO:', src.name)
            moved += 1
        except OSError as exc:
            print('CHYBA (bez přesunu):', src.name, exc)
            skipped += 1
    print('\nHotovo: přesunuto %d, nepřesunuto %d.' % (moved, skipped))
    return 0 if skipped == 0 else 2

if __name__ == '__main__':
    sys.exit(main())
