@echo off
SetLocal
rem #
rem #    Project Name    : Visual Python
rem #    Description     : GUI-based Python code generator
rem #    File Name       : visualpy.bat
rem #    Author          : Black Logic - LJ
rem #    Note            : Control Visual Python for windows
rem #    License         : GPLv3 (GNU General Public License v3.0)
rem #    Date            : 2021. 08. 14
rem #    Change Date     :
rem #

rem #=========================================================================
rem # Check Arguments
rem #   - set VP_OPTION & PIP_T
rem #=========================================================================
set argc=0
for %%x in (%*) do Set /a argc+=1

if %argc% == 1 (
    set VP_OPTION=%1
) else if %argc% == 2 (
    set ARG1=%1
    set ARG2=%2
) else (
    set VP_OPTION=
)

if %argc% == 2 (
    if "%ARG1:~0,2%" == "--" (
        set VP_OPTION=%ARG2%
        set PIP_T=%ARG1:~2%
    ) else (
        set VP_OPTION=%ARG1%
        set PIP_T=%ARG2:~2%
    )
)

rem #=========================================================================
rem # Set variable
rem #=========================================================================
set PIP=pip
where %PIP_T% > nul 2>&1 && set PIP=%PIP_T%

set JP_NB=jupyter nbextension

set VP_NAME=visualpython
set VP_BIND=visualpython/visualpython

set PIP_UNINST=%PIP% uninstall %VP_NAME%
set PIP_UPGRAD=%PIP% install %VP_NAME% --upgrade

rem #=========================================================================
rem # main block
rem #=========================================================================
:f_main
    echo Package install command: %PIP%

    IF /i "%VP_OPTION%"=="" goto :f_help
    for %%i in (-v version)        do if /i %VP_OPTION% == %%i goto :f_version
    for %%i in (-h help)           do if /i %VP_OPTION% == %%i goto :f_help

    call :f_get_string_pipshow RES Location
    set PATH_SRC=%RES%

    call :f_get_extension_path RES
    set PATH_DST=%RES%

    for %%i in (-e enable)         do if /i %VP_OPTION% == %%i goto :f_enable
    for %%i in (-d disable)        do if /i %VP_OPTION% == %%i goto :f_disable
    for %%i in (-i install)        do if /i %VP_OPTION% == %%i goto :f_install
    for %%i in (-un uninstall)     do if /i %VP_OPTION% == %%i goto :f_uninstall
    for %%i in (-up upgrade)       do if /i %VP_OPTION% == %%i goto :f_upgrade

    goto :f_help

    goto :eof

rem #=========================================================================
rem # Install Visual Python
rem #=========================================================================
:f_install
    if not exist "%PATH_DST%" (
        mkdir "%PATH_DST%"
    )

    call :f_check_extension RES
    rem # 1 = Jupyter Extension is not actived
    rem # 2 = visualpython does not exist
    rem # 3 = visualpython exists

    if %RES% == 1 (
        call :f_print_not_extension
    ) else if %RES% == 2 (
        call :f_copy_files
        call :f_enable
    ) else if %RES% == 3 (
        rem # overwrite
        call :f_print_line1
        echo Already exists Visual Python.
        call :f_print_line1

        call :f_disable
        call :f_remove_files
        call :f_copy_files
        call :f_enable
    )

    goto :eof

rem #=========================================================================
rem # Uninstall Visual Python
rem #=========================================================================
:f_uninstall
    call :f_check_extension RES
    rem # 1 = Jupyter Extension is not actived
    rem # 2 = visualpython does not exist
    rem # 3 = visualpython exists

    if %RES% == 2 (
        call :f_print_line2
        %PIP_UNINST%
        call :f_print_line2
    ) else if %RES% == 3 (
        call :f_print_line1
        call :f_disable
        call :f_print_line2
        call :f_remove_files
        call :f_print_line2
        %PIP_UNINST%
        call :f_print_line1
    )

    goto :eof

rem #=========================================================================
rem # Upgrade Visual Python
rem #=========================================================================
:f_upgrade
    call :f_print_line1
    echo Running upgrade Visual Python
    call :f_print_line2

    rem # Get Visual Python version
    call :f_get_string_pipshow RES Version
    set VP_VERSION=%RES%

    %PIP_UPGRAD%

    rem # Get Visual Python new version
    call :f_get_string_pipshow RES Version
    set VP_VERSION_NEW=%RES%

    if "%VP_VERSION%" == "%VP_VERSION_NEW%" (
        call :f_print_line2
        echo Already installed last Visual Python version.
        call :f_print_line2
        echo Installed version    : %VP_VERSION%
        echo Last Release version : %VP_VERSION_NEW%
        call :f_print_line1
    ) else (
        call :f_print_line2
        call :f_disable
        call :f_remove_files
        call :f_copy_files
        call :f_enable
        call :f_print_line1
    )

    goto :eof

rem #=========================================================================
rem # Enable Visual Python
rem #=========================================================================
:f_enable
    call :f_check_extension RES
    if %RES% == 3 %JP_NB% enable %VP_BIND%

    goto :eof

rem #=========================================================================
rem # Disable Visual Python
rem #=========================================================================
:f_disable
    call :f_check_extension RES
    if %RES% == 3 %JP_NB% disable %VP_BIND%

    goto :eof

rem #=========================================================================
rem # Visual Python version
rem #=========================================================================
:f_version
    call :f_get_string_pipshow RES Version
    set VP_VERSION=%RES%
    echo Visual Python %VP_VERSION%

    goto :eof

rem #=========================================================================
rem # Help messages
rem #=========================================================================
:f_help
    echo.
    echo usage: visualpy [option] [--pip3]
    echo.
    echo optional arguments:
    echo   -h,  help       show this help message and exit
    echo   -e,  enable     enable Visual Python
    echo   -d,  disable    disable Visual Python
    echo   -i,  install    install Visual Python extensions
    echo   -ui, uninstall  uninstall Visual Python packages
    echo   -up, upgrade    upgrade Visual Python Package
    echo   -v,  version    show Visual version and exit
    echo.
    echo   --pip3          use pip3 [default: pip]
    echo. 

    goto :eof

rem #=========================================================================
rem # Copy Visual Python files
rem #=========================================================================
:f_copy_files
    call :f_print_line1
    echo Copy visualpython extension files ...
    call :f_print_line2
    echo Source Dir : %PATH_SRC%\%VP_NAME%
    echo Target Dir : %PATH_DST%\%VP_NAME%
    call :f_print_line1
    xcopy /q /y /e "%PATH_SRC%\%VP_NAME%" "%PATH_DST%\%VP_NAME%\"

    goto :eof

rem #=========================================================================
rem # Remove Visual Python files
rem #=========================================================================
:f_remove_files
    call :f_print_line1
    echo Remove Visual Python Directories.
    rmdir /s /q "%PATH_DST%\%VP_NAME%"

    goto :eof

rem #=========================================================================
rem # Check Visual Python files
rem #   1 = Jupyter Extension is not actived
rem #   2 = visualpython does not exist
rem #   3 = visualpython exists
rem #=========================================================================
:f_check_extension
    if not exist "%PATH_DST%" (
        set %~1=1
    ) else if not exist "%PATH_DST%\%VP_NAME%" (
        set %~1=2
    ) else (
        set %~1=3
    )

    goto :eof

rem #=========================================================================
rem # Get string(Version or Location) from pip show
rem #   %~2 = Version or Location
rem #=========================================================================
:f_get_string_pipshow
    set BUF1=
    set RESULT=EMPTY

    for /f "delims=: tokens=1*" %%i in ('%PIP% show %VP_NAME% 2^>^&1 ^| find "%~2"') do (set BUF1=%%j)

    set RESULT=%BUF1: =%
    set %~1=%RESULT%

    goto :eof

rem #=========================================================================
rem # Get string(Jupyter nbextension path) from conda-env or jupyter
rem #=========================================================================
:f_get_extension_path
    set BUF1=
    set BUF2=
    set RESULT=EMPTY

    where /q conda-env
    if "%ERRORLEVEL%" == "0" (
        for /f "delims=* tokens=2" %%i in ('conda-env list 2^>^&1 ^| find "*"') do (set BUF1=%%i)
    ) else (
        for /f "tokens=*" %%i in ('jupyter --data-dir') do (set BUF2=%%i)
    )

    if not "%BUF1%" == "" (
        set RESULT=%BUF1: =%\share\jupyter\nbextensions
    ) else (
        set RESULT=%BUF2: =%\nbextensions
    )
    set %~1=%RESULT%

    goto :eof

rem #=========================================================================
rem # Print extension is not installed
rem #=========================================================================
:f_print_not_extension
    echo Jupyter nbextension is not activated
    echo Please install Jupyter nbextension
    call :f_print_line1
    echo for conda env
    echo conda install -c conda-forge jupyter_contrib_nbextensions
    echo jupyter contrib nbextension install --user
    call :f_print_line2
    echo for pip
    echo %PIP% install -e jupyter_contrib_nbextensions
    echo jupyter contrib nbextension install --user
    call :f_print_line1

    goto :eof

rem #=========================================================================
rem # Print line
rem #=========================================================================
:f_print_line1
    echo ==========================================================================================
    goto :eof

:f_print_line2
    echo ------------------------------------------------------------------------------------------
    goto :eof

rem #=========================================================================

rem # End of file

EndLocal
