'''
This program deletes windows .lnk files if the path they point to no longer
exists.
'''
import argparse
import os
import send2trash
import sys
import winshell

from voussoirkit import interactive
from voussoirkit import pathclass
from voussoirkit import spinal

def prune_shortcuts(recurse=False, autoyes=False):
    if recurse:
        lnks = [file for file in spinal.walk('.') if file.extension == 'lnk']
    else:
        lnks = pathclass.cwd().glob('*.lnk')

    stale = []
    for lnk in lnks:
        shortcut = winshell.Shortcut(lnk.absolute_path)
        # There are some special shortcuts that do not have a path, but instead
        # trigger some action based on a CLSID that Explorer understands.
        # I can't find this information in the winshell.Shortcut object, so for
        # now let's at least not delete these files.
        if shortcut.path == '':
            continue
        if not os.path.exists(shortcut.path):
            stale.append(lnk)

    if not stale:
        return

    print(f'The following {len(stale)} will be recycled:')
    for lnk in stale:
        print(lnk.absolute_path)
    print()

    if autoyes or interactive.getpermission('Is that ok?'):
        for lnk in stale:
            print(lnk.absolute_path)
            send2trash.send2trash(lnk.absolute_path)

def prune_shortcuts_argparse(args):
    return prune_shortcuts(recurse=args.recurse, autoyes=args.autoyes)

def main(argv):
    parser = argparse.ArgumentParser(description=__doc__)

    parser.add_argument('--recurse', action='store_true')
    parser.add_argument('--yes', dest='autoyes', action='store_true')
    parser.set_defaults(func=prune_shortcuts_argparse)

    args = parser.parse_args(argv)
    return args.func(args)

if __name__ == '__main__':
    raise SystemExit(main(sys.argv[1:]))
