package org.semanticweb.owlapi.util;

import java.util.concurrent.atomic.AtomicInteger;
import org.semanticweb.owlapi.model.OWLAnnotationProperty;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataProperty;
import org.semanticweb.owlapi.model.OWLDatatype;
import org.semanticweb.owlapi.model.OWLEntity;
import org.semanticweb.owlapi.model.OWLEntityVisitorEx;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLObjectProperty;

/**
 * Convenience to create c1, c2, p1, p2... entities in replacement of input
 * entities.
 */
public class OWLEntityFragmentProvider implements OWLEntityVisitorEx<String> {

    private static final AtomicInteger classCount = new AtomicInteger();
    private static final AtomicInteger objectPropertyCount = new AtomicInteger();
    private static final AtomicInteger dataPropertyCount = new AtomicInteger();
    private static final AtomicInteger individualCount = new AtomicInteger();
    private static final AtomicInteger annotationPropertyCount = new AtomicInteger();
    private static final AtomicInteger datatypeCount = new AtomicInteger();

    /**
     * @param entity entity to rename
     * @return new name
     */
    public String getName(OWLEntity entity) {
        if (entity.isBuiltIn()) {
            return entity.getIRI().toString();
        }
        return entity.accept(this);
    }

    @Override
    public String visit(OWLClass cls) {
        return "c" + classCount.incrementAndGet();
    }

    @Override
    public String visit(OWLDatatype datatype) {
        return "dt" + datatypeCount.incrementAndGet();
    }

    @Override
    public String visit(OWLNamedIndividual individual) {
        return "i" + individualCount.incrementAndGet();
    }

    @Override
    public String visit(OWLDataProperty property) {
        return "dp" + dataPropertyCount.incrementAndGet();
    }

    @Override
    public String visit(OWLObjectProperty property) {
        return "op" + objectPropertyCount.incrementAndGet();
    }

    @Override
    public String visit(OWLAnnotationProperty property) {
        return "ap" + annotationPropertyCount.incrementAndGet();
    }
}
