#!/usr/bin/env python3
# Copyright (C) 2021, Igalia S.L
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import optparse
import os
import subprocess
import sys

if sys.platform.startswith('linux'):
    top_level_directory = os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..'))
    sys.path.insert(0, os.path.join(top_level_directory, 'Tools', 'flatpak'))
    sys.path.insert(1, os.path.join(top_level_directory, 'Tools', 'Scripts'))

    import flatpakutils
    flatpakutils.run_in_sandbox_if_available(sys.argv)

def main():
    parser = optparse.OptionParser()
    parser.add_option("--platform")
    parser.add_option("--debug", action="store_const", const="debug", dest="configuration")
    parser.add_option("--release", action="store_const", const="release", dest="configuration")

    options, parameters = parser.parse_args()
    if not options.platform:
        parser.error("Platform is required")
        return -1
    if not options.configuration:
        parser.error("Configuration is required")
        return -2

    platform = options.platform.split('-', 1)[0]

    webkit_build_directory = subprocess.Popen(['perl', os.path.join(os.path.dirname(__file__), "webkit-build-directory"),
        "--" + platform, "--" + options.configuration, '--configuration'], stdout=subprocess.PIPE).communicate()[0].strip()

    if platform == 'gtk':
        result = subprocess.run(["cmake", "--install", webkit_build_directory]).returncode
    else:
        parser.error(f"Platform {platform} is not supported yet")
        return -3

    return result

if __name__ == '__main__':
    sys.exit(main())
