package ast;

import java.util.ArrayList;
import java.util.List;
import models.algebra.Type;

public class VariableDeclarationStatement extends Statement {

    private List<Integer> modifiers = new ArrayList<>();
    private Type type = null;
    private List<VariableDeclaration> fragments = new ArrayList<>();

    public List<Integer> getModifiers() {
        return modifiers;
    }

    public void setModifiers(List<Integer> modifiers) {
        this.modifiers = modifiers;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public List<VariableDeclaration> getFragments() {
        return fragments;
    }

    public void addFragment(VariableDeclaration fragment) {
        if (fragment == null) return;

        if (this.type == null) {
            this.type = fragment.getType();
            this.fragments.add(fragment);
        } else {
            if (this.type.equals(fragment.getType())) {
                this.fragments.add(fragment);
            } else {
                System.err.println("Type mismatch: " + fragment);
            }
        }
    }

    public void setFragments(List<VariableDeclaration> fragments) {
        this.fragments = fragments;

        if (fragments != null && !fragments.isEmpty()) {
            this.type = fragments.get(0).getType();
        } else {
            this.type = null;
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();

        for (Integer mod : modifiers) {
            if (mod == Modifier.PRIVATE) sb.append("private ");
            else if (mod == Modifier.PUBLIC) sb.append("public ");
            else if (mod == Modifier.PROTECTED) sb.append("protected ");
            else if (mod == Modifier.STATIC) sb.append("static ");
        }

        if (this.type != null) {
            sb.append(this.type.getInterfaceTypeName()).append(" ");
        }

        for (int i = 0; i < fragments.size(); i++) {
            sb.append(fragments.get(i).toString());
            if (i < fragments.size() - 1)  sb.append(", ");
        }

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