from win32com.shell import shell, shellcon
import win32api
import os


def testSHFileOperation(file_cnt):
    temp_dir = os.environ["temp"]
    orig_fnames = [
        win32api.GetTempFileName(temp_dir, "sfo")[0] for x in range(file_cnt)
    ]
    new_fnames = [
        os.path.join(temp_dir, "copy of " + os.path.split(orig_fnames[x])[1])
        for x in range(file_cnt)
    ]

    pFrom = "\0".join(orig_fnames)
    pTo = "\0".join(new_fnames)

    shell.SHFileOperation(
        (
            0,
            shellcon.FO_MOVE,
            pFrom,
            pTo,
            shellcon.FOF_MULTIDESTFILES | shellcon.FOF_NOCONFIRMATION,
        )
    )
    for fname in orig_fnames:
        assert not os.path.isfile(fname)

    for fname in new_fnames:
        assert os.path.isfile(fname)
        shell.SHFileOperation(
            (
                0,
                shellcon.FO_DELETE,
                fname,
                None,
                shellcon.FOF_NOCONFIRMATION | shellcon.FOF_NOERRORUI,
            )
        )


def testSHNAMEMAPPINGS(file_cnt):
    ## attemps to move a set of files to names that already exist, and generated filenames should be returned
    ##   as a sequence of 2-tuples created from SHNAMEMAPPINGS handle
    temp_dir = os.environ["temp"]
    orig_fnames = [
        win32api.GetTempFileName(temp_dir, "sfo")[0] for x in range(file_cnt)
    ]
    new_fnames = [win32api.GetTempFileName(temp_dir, "sfo")[0] for x in range(file_cnt)]
    pFrom = "\0".join(orig_fnames)
    pTo = "\0".join(new_fnames)
    rc, banyaborted, NameMappings = shell.SHFileOperation(
        (
            0,
            shellcon.FO_MOVE,
            pFrom,
            pTo,
            shellcon.FOF_MULTIDESTFILES
            | shellcon.FOF_NOCONFIRMATION
            | shellcon.FOF_RENAMEONCOLLISION
            | shellcon.FOF_WANTMAPPINGHANDLE,
        )
    )

    for old_fname, new_fname in NameMappings:
        print("Old:", old_fname, "New:", new_fname)
    assert len(NameMappings) == file_cnt


testSHFileOperation(10)
testSHFileOperation(1)
testSHNAMEMAPPINGS(5)
