#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Bezpecny presun videi bez oznaceni jazyka/kvality, ktera nejsou MP4."""
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_EXTS = {'.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm', '.mpeg', '.mpg', '.m4v', '.ts', '.m2ts', '.3gp'}
LANG_RE = re.compile(r'(?<![a-z0-9])(?:cz|cze|czech|sk|svk|slovak|en|eng|english|de|ger|deu|fr|fra|fre|es|spa|pl|pol|hu|hun|dabing|dual)(?![a-z0-9])', re.I)
QUALITY_RE = re.compile(r'(?<![a-z0-9])(?:2160p|1440p|1080p|720p|576p|540p|480p|360p|240p|4k|uhd|fhd|full[ ._-]?hd|hd|sd)(?![a-z0-9])', re.I)


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--apply', action='store_true', help='Po potvrzeni skutecne presune soubory')
    args = parser.parse_args()
    if not SOURCE.is_dir():
        print('CHYBA: Zdrojova slozka neexistuje:', SOURCE)
        return 1
    if DEST.exists() and not DEST.is_dir():
        print('CHYBA: Cilova cesta existuje, ale neni slozkou:', DEST)
        return 1

    selected = []
    for src in sorted(SOURCE.iterdir(), key=lambda p: p.name.casefold()):
        if not src.is_file() or src.is_symlink() or src.suffix.lower() not in VIDEO_EXTS:
            continue
        stem = src.stem
        missing = []
        if not LANG_RE.search(stem):
            missing.append('jazyk')
        if not QUALITY_RE.search(stem):
            missing.append('kvalita')
        if missing:
            selected.append((src, DEST / src.name, ', '.join(missing)))

    print('Zdroj:', SOURCE)
    print('Cil:', DEST)
    print('Vybrano souboru:', len(selected))
    print('Podminka: video != MP4 a chybi jazyk nebo kvalita (nebo oboji)')
    print('-' * 75)
    for n, (src, dst, missing) in enumerate(selected, 1):
        collision = ' [KOLIZE - PRESKOCIT]' if dst.exists() else ''
        print('{}. {} | chybi: {}{}'.format(n, src.name, missing, collision))
    print('-' * 75)
    if not args.apply:
        print('NAHLED: Nic nebylo presunuto. Pro provedeni pouzij --apply.')
        return 0
    if not selected:
        print('Neni co presouvat.')
        return 0
    if input('Provest presun? Napis ano: ').strip().casefold() != 'ano':
        print('Zruseno. Nic nebylo presunuto.')
        return 0

    DEST.mkdir(parents=True, exist_ok=True)
    done = skipped = failed = 0
    for src, dst, missing in selected:
        if not src.is_file() or src.is_symlink():
            print('PRESKOCENO (zdroj se zmenil):', src.name)
            skipped += 1
            continue
        if dst.exists():
            print('PRESKOCENO (cil existuje):', dst.name)
            skipped += 1
            continue
        try:
            # Link vytvori cil vyhradne, pokud neexistuje; potom odebere puvodni jmeno.
            # Oba adresare jsou na /volume1 (stejny souborovy system).
            os.link(str(src), str(dst))
            try:
                os.unlink(str(src))
            except OSError:
                # Pri neuspesnem odstraneni zdroje zachovame oba odkazy,
                # aby se neztratila data.
                print('VAROVANI: Cil vytvoren, ale zdroj nesel odstranit:', src.name)
                failed += 1
                continue
            print('PRESUNUTO:', src.name)
            done += 1
        except OSError as exc:
            print('CHYBA:', src.name, '-', exc)
            failed += 1
    print('Dokonceno: presunuto {}, preskoceno {}, chyby {}.'.format(done, skipped, failed))
    return 1 if failed else 0


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