--!A cross-platform build utility based on Lua
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Copyright (C) 2015-present, Xmake Open Source Community.
--
-- @author      ruki
-- @file        installcmd.lua
--

-- imports
import("core.project.config")

-- get dotnet program
function _get_dotnet(target)
    return target:tool("cs") or "dotnet"
end

-- get build configuration from mode
function _get_configuration()
    local mode = config.mode() or "release"
    if mode:lower() == "debug" then
        return "Debug"
    end
    return "Release"
end

-- install csharp target for xpack using dotnet publish
function main(target, batchcmds, opt)
    local package = opt.package
    if not package then
        return
    end

    local installdir = package:installdir()
    if not installdir then
        return
    end

    -- get output directory based on target kind
    -- on windows, shared libraries (dll) should also go to bindir
    local outputdir
    if target:is_binary() or (target:is_shared() and target:is_plat("windows", "mingw")) then
        outputdir = package:installdir("bin")
    else
        outputdir = package:installdir("lib")
    end

    -- run dotnet publish to a temporary publish directory, then copy to install directory
    local publishdir = path.join(target:autogendir(), "rules", "csharp", "publish")
    local csprojfile = target:data("csharp.csproj")
    local argv = {"publish"}
    if csprojfile then
        table.insert(argv, csprojfile)
    end
    table.join2(argv, {"--nologo",
        "--configuration", _get_configuration(),
        "--output", publishdir})
    local dotnet = _get_dotnet(target)
    batchcmds:vrunv(dotnet, argv)

    -- copy published files to output directory
    batchcmds:mkdir(outputdir)
    batchcmds:cp(path.join(publishdir, "**"), outputdir, {rootdir = publishdir})

    -- install extra files (add_installfiles)
    local srcfiles, dstfiles = target:installfiles(installdir)
    if srcfiles and dstfiles then
        for idx, srcfile in ipairs(srcfiles) do
            batchcmds:cp(srcfile, dstfiles[idx])
        end
    end
end
