/*
 * Copyright (c) 2017 Cisco and/or its affiliates.
 *
 * 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.
 */

package io.fd.maintainer.plugin.service.dto;

import com.google.gerrit.reviewdb.client.RefNames;

public class PluginBranchSpecificSettings {

    private static final String HEAD_PART = "/" + RefNames.HEAD;

    private final String pluginUserName;
    private final String branch;
    private final String fileRef;
    private final String localFilePath;
    private final boolean allowMaintainersSubmit;
    private final boolean autoAddReviewers;
    private final boolean autoSubmit;
    private final boolean dislikeWarnings;

    private PluginBranchSpecificSettings(final String pluginUserName,
                                         final String branch,
                                         final String fileRef,
                                         final String localFilePath,
                                         final boolean allowMaintainersSubmit,
                                         final boolean autoAddReviewers,
                                         final boolean autoSubmit,
                                         final boolean dislikeWarnings) {
        this.pluginUserName = pluginUserName;
        this.branch = branch;
        this.fileRef = fileRef;
        this.localFilePath = localFilePath;
        this.allowMaintainersSubmit = allowMaintainersSubmit;
        this.autoAddReviewers = autoAddReviewers;
        this.autoSubmit = autoSubmit;
        this.dislikeWarnings = dislikeWarnings;
    }

    public String getLocalFilePath() {
        return localFilePath;
    }

    public boolean isAllowMaintainersSubmit() {
        return allowMaintainersSubmit;
    }

    public boolean isAutoAddReviewers() {
        return autoAddReviewers;
    }

    public boolean isAutoSubmit() {
        return autoSubmit;
    }

    public String fullFileRef() {
        return branch.concat(fileRef);
    }

    public String getPluginUserName() {
        return pluginUserName;
    }

    public boolean isDislikeWarnings() {
        return dislikeWarnings;
    }

    @Override
    public String toString() {
        return "PluginBranchSpecificSettings{" +
                "pluginUserName='" + pluginUserName + '\'' +
                ", branch='" + branch + '\'' +
                ", fileRef='" + fileRef + '\'' +
                ", localFilePath='" + localFilePath + '\'' +
                ", allowMaintainersSubmit=" + allowMaintainersSubmit +
                ", autoAddReviewers=" + autoAddReviewers +
                ", autoSubmit=" + autoSubmit +
                ", dislikeWarnings=" + dislikeWarnings +
                '}';
    }

    public static class PluginSettingsBuilder {
        private String pluginUserName;
        private String branch;
        private String fileRef;
        private String localFilePath;
        private boolean allowMaintainersSubmit;
        private boolean autoAddReviewers;
        private boolean autoSubmit;
        private boolean dislikeWarnings;

        private static String reduceWildcard(String input) {
            return input.contains("*")
                    ? input.substring(0, input.indexOf("*"))
                    : input;
        }

        private static String addEndSlash(String input) {
            return input.endsWith("/")
                    ? input
                    : input.concat("/");
        }

        public PluginSettingsBuilder setPluginUserName(final String pluginUserName) {
            this.pluginUserName = pluginUserName;
            return this;
        }

        public PluginSettingsBuilder setFileRef(final String fileRef) {
            // TODO - remove this replace if configuration will be changed
            this.fileRef = fileRef.replace(HEAD_PART, "");
            return this;
        }

        public PluginSettingsBuilder setLocalFilePath(final String localFilePath) {
            this.localFilePath = localFilePath;
            return this;
        }

        public PluginSettingsBuilder setAllowMaintainersSubmit(final boolean allowMaintainersSubmit) {
            this.allowMaintainersSubmit = allowMaintainersSubmit;
            return this;
        }

        public PluginSettingsBuilder setAutoAddReviewers(final boolean autoAddReviewers) {
            this.autoAddReviewers = autoAddReviewers;
            return this;
        }

        public PluginSettingsBuilder setBranch(final String branch) {
            this.branch = addEndSlash(reduceWildcard(branch));
            return this;
        }

        public PluginSettingsBuilder setAutoSubmit(final boolean autoSubmit) {
            this.autoSubmit = autoSubmit;
            return this;
        }

        public PluginSettingsBuilder setDislikeWarnings(final boolean dislikeWarnings) {
            this.dislikeWarnings = dislikeWarnings;
            return this;
        }

        public PluginBranchSpecificSettings createPluginSettings() {
            return new PluginBranchSpecificSettings(pluginUserName, branch, fileRef, localFilePath,
                    allowMaintainersSubmit, autoAddReviewers, autoSubmit, dislikeWarnings);
        }
    }
}
