/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * 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 com.intellij.xml.util.documentation;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Dennis.Ushakov
 */
public class MimeTypeDictionary {
  private static Set<String> ourContentTypes;

  public static Collection<String> getContentTypes() {
    if (ourContentTypes == null) {
      ourContentTypes = loadContentTypes();
    }
    return ourContentTypes;
  }

  private static Set<String> loadContentTypes() {
    final TreeSet<String> result = new TreeSet<String>();
    result.add("*/*");
    // IANA Media Types: http://www.iana.org/assignments/media-types/media-types.xhtml
    readMediaTypes(result, "application");
    readMediaTypes(result, "audio");
    readMediaTypes(result, "image");
    readMediaTypes(result, "message");
    readMediaTypes(result, "model");
    readMediaTypes(result, "multipart");
    readMediaTypes(result, "text");
    readMediaTypes(result, "video");
    return result;
  }

  private static void readMediaTypes(TreeSet<String> result, final String category) {
    final InputStream stream = MimeTypeDictionary.class.getResourceAsStream("mimeTypes/" + category + ".csv");
    String csv = "";
    try {
      csv = stream != null ? FileUtil.loadTextAndClose(stream) : "";
    }
    catch (IOException e) {
      Logger.getInstance(MimeTypeDictionary.class).error(e);
    }
    final String[] lines = StringUtil.splitByLines(csv);
    for (String line : lines) {
      if (line == lines[0]) continue;

      final String[] split = line.split(",");
      if (split.length > 1) {
        result.add(!split[1].isEmpty() ? split[1] : withCategory(category, split[0]));
      }
    }
  }

  private static String withCategory(String category, String name) {
    final int whitespacePosition = name.indexOf(' ');
    return category + "/" + (whitespacePosition > 0 ? name.substring(0, whitespacePosition) : name);
  }
}
