#! /usr/bin/env python

# ICON
#
# ------------------------------------------
# Copyright (C) 2004-2026, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
# Contact information: icon-model.org
# See AUTHORS.TXT for a list of authors
# See LICENSES/ for license information
# SPDX-License-Identifier: BSD-3-Clause
# ------------------------------------------

import glob
import os
import stat

# -*- coding: utf-8 -*-
# ==============================================================================
# Creates the ICON multiple builds based on config/multiple_builds
# Leonidas Linardakis, MPI-M, 2011-25-1
# ==============================================================================
import sys

create_folders = ["run", "config"]

all_files = os.listdir(".")
# print all_files


def warning(where, message):
    print("********************")
    print("Warning: " + where + " " + message)
    print("********************")


def error(where, message):
    print("********************")
    print("ERROR: " + where + " " + message)
    print("Exit 1 ")
    print("********************")
    sys.exit(1)


def create_build_folder(build_folder):
    if len(build_folder) < 1:
        error(build_folder, " invalid folder name")

    # ---------------------------
    # build the ...build
    # ---------------------------
    # create subfolders
    if os.access(build_folder, os.F_OK):
        warning(build_folder, "exists, skipping it.")
        return
    else:
        os.mkdir(build_folder)

    # if the grid folder does not exist, create it
    if not os.access("grids", os.F_OK):
        os.mkdir("grids")
    # make the links
    for file in all_files:
        os.symlink("../" + file, build_folder + "/" + file)

    for folder in create_folders:
        os.remove(build_folder + "/" + folder)
        os.mkdir(build_folder + "/" + folder)
        folder_files = os.listdir(folder)
        for file in folder_files:
            link_file = folder + "/" + file
            os.symlink("../../" + link_file, build_folder + "/" + link_file)


def create_build_local(build_folder, configure_options):
    build_local_file = build_folder + "/build_local"
    build_local = open(build_local_file, "w")
    build_local.write("./configure " + configure_options + "\n")
    # build_local.write("./build_command\n")
    build_local.close()
    os.chmod(build_local_file, stat.S_IRWXU | stat.S_IRGRP)


builds_file = "./config/multiple_builds"
noOfTabSpaces = 1
run_scripts = []


infile = open(builds_file, "r")
for line in infile:
    # replace tabs and remove leadin, trailing spaces
    line = line.expandtabs(noOfTabSpaces)
    line = line.lstrip()
    line = line.rstrip()
    lineLength = len(line)
    if lineLength < 1:
        continue
    if line[0] == "#":
        continue
    if lineLength < 10:
        error(line, " invalid line")
        continue

    # check if it's run_scripts
    sep_idx = line.find("run_scripts")
    if sep_idx > -1:
        # it's run_scripts
        sep_idx = line.find("=")
        if sep_idx < 1:
            error(line, "wrong syntax")
        line = line[sep_idx + 1 :]
        line = line.rstrip()

        run_scripts = []
        while len(line) > 0:
            line = line.lstrip()
            sep_idx = line.find(",")
            if sep_idx < 0:
                sep_idx = len(line)
            new_script = line[0:sep_idx]
            new_script = new_script.rstrip()
            run_scripts.append(new_script)

            line = line[sep_idx + 1 :]
        continue

    # get build_folder
    sep_idx = line.find("=")
    if sep_idx < 1:
        error(line, "wrong syntax")
        continue
    parameter_name = line[0:sep_idx]
    parameter_name = parameter_name.rstrip()
    if parameter_name != "build_folder":
        error(parameter_name, " != build_folder")
        continue
    line = line[sep_idx + 1 :]
    line = line.lstrip()
    sep_idx = line.find("configure_options")
    if sep_idx < 1:
        error("configure_options", "parameter not found")
        continue
    build_folder = line[0:sep_idx]
    build_folder = build_folder.rstrip()

    # get configure_options
    line = line[sep_idx:]
    sep_idx = line.find("=")
    if sep_idx < 1:
        error(line, "wrong syntax")
        continue
    configure_options = line[sep_idx + 1 :]

    print(
        "Creating "
        + build_folder
        + " with configure_options:"
        + configure_options
    )
    create_build_folder(build_folder)
    # create the build_local
    create_build_local(build_folder, configure_options)

sys.exit(0)
