# Copyright 2004-2025 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

init python:
    import fnmatch
    import re
    import zipfile

    def install_from_zip(name, zipglob, patterns):

        # Determine the filename matching the zipglob, and put it into filename.
        filenames = [ i for i in os.listdir(config.renpy_base) if fnmatch.fnmatch(i.lower(), zipglob.lower()) ]

        if not filenames:
            interface.error(
                _("Could not install [name!t], as a file matching [zipglob] was not found in the Ren'Py SDK directory."),
                label="preferences",
                name=name,
                zipglob=zipglob,
            )

        filenames.sort(key=lambda a : a.lower())
        filename = filenames[-1]

        # The zipfile.
        zf = zipfile.ZipFile(os.path.join(config.renpy_base, filename))

        for fn in zf.namelist():
            matchfn = fn.replace("\\", "/")
            dstfn = None

            renpy.write_log(fn)

            for src, dst in patterns:
                if re.match(src, matchfn):
                    dstfn = re.sub(src, dst, matchfn)
                    break

            if not dstfn:
                continue

            dstfn = os.path.join(config.renpy_base, dstfn)

            if not os.path.exists(os.path.dirname(dstfn)):
                try:
                    os.makedirs(os.path.dirname(dstfn))
                except Exception:
                    pass

            renpy.write_log(fn + " -> " + dstfn)

            data = zf.read(fn)
            with open(dstfn, "wb") as f:
                f.write(data)

            try:
                os.chmod(dstfn, 0o755)
            except Exception:
                pass

        interface.info(_("Successfully installed [name!t]."), name=name)


label install_live2d:
    python hide:
        _prefix = r"lib/py3-"

        patterns = [
            (r".*/Core/dll/linux/x86_64/(libLive2DCubismCore.so)", _prefix + r"linux-x86_64/\1"),
            (r".*/Core/dll/windows/x86_64/(Live2DCubismCore.dll)", _prefix + r"windows-x86_64/\1"),
            (r".*/Core/dll/macos/(libLive2DCubismCore.dylib)", _prefix + r"mac-universal/\1"),
            (r".*/Core/dll/experimental/rpi/(libLive2DCubismCore.so)", _prefix + r"linux-armv7l/\1"),

            (r".*/Core/dll/android/(armeabi-v7a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
            (r".*/Core/dll/android/(arm64-v8a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
            (r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
        ]

        install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-[45]-*.zip", patterns)

    jump front_page

label install_live2d_web:
    python hide:
        patterns = [
            (r".*/Core/live2dcubismcore.js", "lib/web/live2dcubismcore.js"),
        ]

        install_from_zip("Live2D Cubism SDK for Web", "CubismSdkForWeb-5-*.zip", patterns)

    jump front_page

screen install_preferences():

    frame:
        style "l_indent"
        has vbox

        text _("This screen allows you to install libraries that can't be distributed with Ren'Py. Some of these libraries may require you to agree to a third-party license before being used or distributed.")

    add SPACER

    if not achievement.has_steam:

        textbutton _("Install Steam Support"):
            action Jump("install_steam")

        add HALF_SPACER

        frame:
            style "l_indent"
            has vbox

            text _("Before installing Steam support, please make sure you are a {a=https://partner.steamgames.com/}Steam partner{/a}.")

    else:

        textbutton _("Install Steam Support")

        add HALF_SPACER

        frame:
            style "l_indent"
            has vbox

            text _("Steam support has already been installed.")

    add SPACER

    textbutton _("Install Live2D Cubism SDK for Native"):
        action Jump("prompt_live2d")

    add HALF_SPACER

    textbutton _("Install Live2D Cubism SDK for Web"):
        action Jump("prompt_live2d_web")

screen install_live2d(web=False):

    frame:
        style_group "l"
        style "l_root"

        window:

            has vbox

            label _("Install Libraries")

            add HALF_SPACER

            hbox:
                frame:
                    style "l_indent"
                    xfill True

                    viewport:
                        scrollbars "vertical"
                        mousewheel True

                        has vbox

                        add SPACER

                        if web:
                            textbutton _("Install Live2D Cubism SDK for Web"):
                                action Jump("install_live2d_web")

                        else:

                            textbutton _("Install Live2D Cubism SDK for Native"):
                                action Jump("install_live2d")

                        add HALF_SPACER

                        frame:
                            style "l_indent"
                            has vbox

                            if web:
                                text _("The {a=https://www.live2d.com/en/sdk/download/web/}Cubism SDK for Web{/a} adds support for displaying Live2D models. Place CubismSdkForWeb-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc.")
                            else:
                                text _("The {a=https://www.live2d.com/en/sdk/download/native/}Cubism SDK for Native{/a} adds support for displaying Live2D models. Place CubismSdkForNative-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc.")

                            add SPACER

                            text _("Live2D doesn't support Android x86_64 (including emulators and Chrome OS) and must be added to iOS projects manually. Live2D must be reinstalled after upgrading Ren'Py or installing Android support.")

    textbutton _("Cancel") action Return(False) style "l_left_button"
    textbutton _("Open Ren'Py SDK Directory") action OpenDirectory(config.renpy_base, absolute=True) style "l_right_button"

    timer 2.0 action renpy.restart_interaction repeat True

label prompt_live2d:
    call screen install_live2d(web=False)
    jump preferences

label prompt_live2d_web:
    call screen install_live2d(web=True)
    jump preferences

label install_steam:
    $ add_dlc("steam", restart=True)
    jump install
