#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright (C) 2021 Igalia S.L.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.

import flatpakutils
import os
import sys

platform = "GTK"
build_type = "Release"
if "--wpe" in sys.argv:
    platform = "WPE"
    sys.argv.remove("--wpe")
if "--gtk" in sys.argv:
    sys.argv.remove("--gtk")

if "--debug" in sys.argv:
    build_type = "Debug"
    sys.argv.remove("--debug")
if "--release" in sys.argv:
    sys.argv.remove("--release")

build_path = os.environ['WEBKIT_OUTPUTDIR'] if 'WEBKIT_OUTPUTDIR' in os.environ \
    else flatpakutils.DEFAULT_BUILD_ROOT
mappings = "--path-mappings=" + ",".join([
    "{}={}".format(
        os.path.join(flatpakutils.SANDBOX_SOURCE_ROOT, flatpakutils.BUILD_ROOT_DIR_NAME, "Debug"),
        os.path.join(build_path, platform, "Debug")),
    "{}={}".format(
        os.path.join(flatpakutils.SANDBOX_SOURCE_ROOT, flatpakutils.BUILD_ROOT_DIR_NAME, "Release"),
        os.path.join(build_path, platform, "Release")),
    "{}={}".format(
        os.path.join(flatpakutils.WEBKIT_SOURCE_DIR, "Source"),
        os.path.join(flatpakutils.SANDBOX_SOURCE_ROOT, "Source")),
])

build_dir = os.path.join(flatpakutils.SANDBOX_SOURCE_ROOT, flatpakutils.BUILD_ROOT_DIR_NAME, build_type)
extra_options = [f"--compile-commands-dir={build_dir}"]

command = ["clangd", mappings] + extra_options + sys.argv[1:]
print(f"Running clangd with arguments: {command}")
flatpakutils.run_in_sandbox_if_available(command)
