/*
 * Copyright 2017-present Open Networking Laboratory
 *
 * 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 org.onosproject.tl1;

import java.util.Optional;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;

/**
 * Default implementation of a TL1 command.
 */
public final class DefaultTl1Command implements Tl1Command {
    private static final char HYPHEN = '-';
    private static final char COLON = ':';
    private static final char SEMICOLON = ';';

    private String verb;
    private String modifier;
    private Optional<String> tid;
    private String aid;
    private int ctag;
    private String parameters;

    private DefaultTl1Command(String verb, String modifier, String tid, String aid, int ctag, String parameters) {
        this.verb = verb;
        this.modifier = modifier;
        this.tid = Optional.ofNullable(tid);
        this.aid = aid;
        this.ctag = ctag;
        this.parameters = parameters;
    }

    @Override
    public String verb() {
        return verb;
    }

    @Override
    public String modifier() {
        return modifier;
    }

    @Override
    public Optional<String> tid() {
        return tid;
    }

    @Override
    public Optional<String> aid() {
        return Optional.ofNullable(aid);
    }

    @Override
    public int ctag() {
        return ctag;
    }

    @Override
    public Optional<String> parameters() {
        return Optional.ofNullable(parameters);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder()
                .append(verb).append(HYPHEN)
                .append(modifier).append(COLON)
                .append(tid().orElse("")).append(COLON)
                .append(aid().orElse("")).append(COLON)
                .append(ctag);

        if (parameters().isPresent()) {
            sb.append(COLON).append(COLON).append(parameters);
        }

        return sb.append(SEMICOLON).toString();
    }

    public static Builder builder() {
        return new Builder();
    }

    public static final class Builder implements Tl1Command.Builder {
        private String verb;
        private String modifier;
        private String tid;
        private String aid;
        private int ctag;
        private String parameters;

        @Override
        public Tl1Command.Builder withVerb(String verb) {
            this.verb = verb;
            return this;
        }

        @Override
        public Tl1Command.Builder withModifier(String modifier) {
            this.modifier = modifier;
            return this;
        }

        @Override
        public Tl1Command.Builder forTid(String tid) {
            this.tid = tid;
            return this;
        }

        @Override
        public Tl1Command.Builder withAid(String aid) {
            this.aid = aid;
            return this;
        }

        @Override
        public Tl1Command.Builder withCtag(int ctag) {
            this.ctag = ctag;
            return this;
        }

        @Override
        public Tl1Command.Builder withParameters(String parameters) {
            this.parameters = parameters;
            return this;
        }

        @Override
        public Tl1Command build() {
            checkNotNull(verb, "Must supply a verb");
            checkNotNull(modifier, "Must supply a modifier");

            checkArgument(MIN_CTAG < ctag, "ctag cannot be less than " + MIN_CTAG);
            checkArgument(ctag <= MAX_CTAG, "ctag cannot be larger than " + MAX_CTAG);

            return new DefaultTl1Command(verb, modifier, tid, aid, ctag, parameters);
        }
    }
}
