package org.jboss.resteasy.plugins.providers.jaxb;

import java.lang.annotation.Annotation;

import jakarta.ws.rs.core.MediaType;

import org.jboss.logging.Logger;
import org.jboss.resteasy.annotations.providers.jaxb.IgnoreMediaTypes;
import org.jboss.resteasy.spi.util.FindAnnotation;

/**
 * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
 * @version $Revision: 1 $
 */
public class IgnoredMediaTypes {
    private static String getVendorString(String subtype) {
        int idx = subtype.indexOf('+');
        if (idx < 0)
            return subtype;
        return subtype.substring(0, idx);
    }

    private static String getSubtype(String subtype) {
        int idx = subtype.indexOf('+');
        if (idx < 0)
            return subtype;
        return subtype.substring(idx + 1);
    }

    public static boolean ignored(Class<?> type, Annotation[] annotations, MediaType mediaType) {
        IgnoreMediaTypes ignore = FindAnnotation.findAnnotation(type, annotations, IgnoreMediaTypes.class);
        if (ignore == null)
            return false;
        for (String mime : ignore.value()) {
            if (compare(mediaType, mime))
                return true;
        }
        return false;
    }

    private static boolean compare(MediaType mediaType, String mime) {
        MediaType mt = MediaType.valueOf(mime);
        if (mt.isWildcardType() || mediaType.isWildcardType())
            return true;
        if (!mediaType.getType().equals(mt.getType()))
            return false;
        if (mt.isWildcardSubtype() || mediaType.isWildcardSubtype())
            return true;
        if (mt.getSubtype().startsWith("*+")) {
            String compare = getSubtype(mt.getSubtype());
            String compare2 = getSubtype(mediaType.getSubtype());
            return compare.equals(compare2);
        } else if (mt.getSubtype().endsWith("+*")) {
            String compare = getVendorString(mt.getSubtype());
            String compare2 = getVendorString(mediaType.getSubtype());
            return compare.equals(compare2);
        } else {
            return mt.getSubtype().equals(mediaType.getSubtype());
        }
    }

    public static void main(String[] args) {
        Logger LOG = Logger.getLogger(IgnoredMediaTypes.class);
        LOG.info(getVendorString("foo+json"));
        LOG.info(getSubtype("foo+json"));

    }

}
