/*-
 * #%L
 * JSQLParser library
 * %%
 * Copyright (C) 2004 - 2020 JSQLParser
 * %%
 * Dual licensed under GNU LGPL 2.1 or Apache License 2.0
 * #L%
 */
package net.sf.jsqlparser.util.validation.metadata;

import java.util.List;
import java.util.Objects;

public class Named {

    private final NamedObject namedObject;
    private final String fqn;
    private String alias;
    private List<NamedObject> parents;

    private String fqnLookup;
    private String aliasLookup;

    public Named(NamedObject namedObject, String fqn) {
        Objects.requireNonNull(namedObject, "named object must not be null");
        Objects.requireNonNull(fqn, "fully qualified name must not be null");
        this.namedObject = namedObject;
        this.fqn = fqn;
    }

    public String getFqn() {
        return fqn;
    }

    public String getAlias() {
        return alias;
    }

    public Named setAlias(String alias) {
        this.alias = alias;
        return this;
    }

    public NamedObject getNamedObject() {
        return namedObject;
    }

    public List<NamedObject> getParents() {
        return parents;
    }

    public Named setParents(List<NamedObject> parents) {
        this.parents = parents;
        return this;
    }

    /**
     * @return the fqn transformed for catalog-lookup (uppercase/lowercase/.. depends on database)
     */
    public String getFqnLookup() {
        return fqnLookup;
    }

    public Named setFqnLookup(String fqnLookup) {
        this.fqnLookup = fqnLookup;
        return this;
    }

    /**
     * @return the alias transformed for catalog-lookup (uppercase/lowercase/.. depends on database)
     */
    public String getAliasLookup() {
        return aliasLookup;
    }

    public Named setAliasLookup(String aliasLookup) {
        this.aliasLookup = aliasLookup;
        return this;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((alias == null) ? 0 : alias.hashCode());
        result = prime * result + fqn.hashCode();
        result = prime * result + namedObject.hashCode();
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Named other = (Named) obj;
        if (alias == null) {
            if (other.alias != null) {
                return false;
            }
        } else if (!alias.equals(other.alias)) {
            return false;
        }
        if (!fqn.equals(other.fqn)) {
            return false;
        }
        if (namedObject != other.namedObject) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Named [namedObject=" + namedObject + ", fqn=" + fqn + ", alias=" + alias
                + ", parents=" + parents + "]";
    }


}
