/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

package com.epam.datalab.properties;

public interface ChangePropertiesConst {
    String GKE_SELF_SERVICE_PATH = "/root/self-service.yaml";
    String GKE_SELF_SERVICE = "self-service.yaml";
    String SELF_SERVICE = "self-service.yml";
    String SELF_SERVICE_PROP_PATH = "/opt/datalab/conf/self-service.yml";
    //            String SELF_SERVICE_PROP_PATH = "services/self-service/self-service.yml";
    String PROVISIONING_SERVICE = "provisioning.yml";
    String PROVISIONING_SERVICE_PROP_PATH = "/opt/datalab/conf/provisioning.yml";
//            String PROVISIONING_SERVICE_PROP_PATH = "services/provisioning-service/provisioning.yml";

    String BILLING_SERVICE = "billing.yml";
    String BILLING_SERVICE_PROP_PATH = "/opt/datalab/conf/billing.yml";
    //        String BILLING_SERVICE_PROP_PATH = "services/billing-gcp/billing.yml";
    //      String BILLING_SERVICE_PROP_PATH = "services/billing-azure/billing.yml";
//    String BILLING_SERVICE_PROP_PATH = "services/billing-aws/billing.yml";
    String GKE_BILLING_PATH = "/root/billing.yaml";
    String GKE_BILLING_SERVICE = "billing.yml";
    String RESTART_URL = "config/restart";
    String LOCAL_ENDPOINT_NAME = "local";
    String BASE_CONFIG_URL = "config";

    String SELF_SERVICE_SUPERVISORCTL_RUN_NAME = " ui ";
    String PROVISIONING_SERVICE_SUPERVISORCTL_RUN_NAME = " provserv ";
    String BILLING_SERVICE_SUPERVISORCTL_RUN_NAME = " billing ";
    String SECRET_REGEX = "((.*)[sS]ecret(.*)|(p|P)assword): (.*)";
    String USER_REGEX = " *(user|username): (.*)";
    String SECRET_REPLACEMENT_FORMAT = " ***********";
    String SUPERVISORCTL_RESTART_SH_COMMAND = "sudo supervisorctl restart";
    String CHANGE_CHMOD_SH_COMMAND_FORMAT = "sudo chmod %s %s";
    String DEFAULT_CHMOD = "644";
    String WRITE_CHMOD = "777";

    String LICENCE_REGEX = "# \\*{50,}";
    String LICENCE =
            "# *****************************************************************************\n" +
                    "#\n" +
                    "# Licensed to the Apache Software Foundation (ASF) under one\n" +
                    "# or more contributor license agreements. See the NOTICE file\n" +
                    "# distributed with this work for additional information\n" +
                    "# regarding copyright ownership. The ASF licenses this file\n" +
                    "# to you under the Apache License, Version 2.0 (the\n" +
                    "# \"License\"); you may not use this file except in compliance\n" +
                    "# with the License. You may obtain a copy of the License at\n" +
                    "#\n" +
                    "# http://www.apache.org/licenses/LICENSE-2.0\n" +
                    "#\n" +
                    "# Unless required by applicable law or agreed to in writing,\n" +
                    "# software distributed under the License is distributed on an\n" +
                    "# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" +
                    "# KIND, either express or implied. See the License for the\n" +
                    "# specific language governing permissions and limitations\n" +
                    "# under the License.\n" +
                    "#\n" +
                    "# ******************************************************************************";

    int DEFAULT_VALUE_PLACE = 1;
    int DEFAULT_NAME_PLACE = 0;
}
