// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BUFFET_MIME_UTILS_H_
#define BUFFET_MIME_UTILS_H_

#include <string>
#include <utility>
#include <vector>

#include <base/basictypes.h>

namespace buffet {

namespace mime {

namespace types {
  // Main MIME type categories
  extern const char kApplication[];        // application
  extern const char kAudio[];              // audio
  extern const char kImage[];              // image
  extern const char kMessage[];            // message
  extern const char kMultipart[];          // multipart
  extern const char kText[];               // test
  extern const char kVideo[];              // video
}

namespace parameters {
  // Common MIME parameters
  extern const char kCharset[];            // charset=...
}

namespace image {
  // Common image MIME types
  extern const char kJpeg[];               // image/jpeg
  extern const char kPng[];                // image/png
  extern const char kBmp[];                // image/bmp
  extern const char kTiff[];               // image/tiff
  extern const char kGif[];                // image/gif
}

namespace text {
  // Common text MIME types
  extern const char kPlain[];              // text/plain
  extern const char kHtml[];               // text/html
  extern const char kXml[];                // text/xml
}

namespace application {
  // Common application MIME types
  extern const char kOctet_stream[];       // application/octet-stream
  extern const char kJson[];               // application/json
  extern const char kWwwFormUrlEncoded[];  // application/x-www-form-urlencoded
}

typedef std::vector<std::pair<std::string, std::string>> Parameters;

// Combine a MIME type, subtype and parameters into a MIME string.
// e.g. Combine("text", "plain", {{"charset", "utf-8"}}) will give:
//      "text/plain; charset=utf-8"
std::string Combine(const std::string& type, const std::string& subtype,
                    const Parameters& parameters = {}) WARN_UNUSED_RESULT;

// Splits a MIME string into type and subtype.
// "text/plain;charset=utf-8" => ("text", "plain")
bool Split(const std::string& mime_string,
           std::string* type, std::string* subtype);

// Splits a MIME string into type, subtype, and parameters.
// "text/plain;charset=utf-8" => ("text", "plain", {{"charset","utf-8"}})
bool Split(const std::string& mime_string,
           std::string* type, std::string* subtype, Parameters* parameters);

// Returns the MIME type from MIME string.
// "text/plain;charset=utf-8" => "text"
std::string GetType(const std::string& mime_string);

// Returns the MIME sub-type from MIME string.
// "text/plain;charset=utf-8" => "plain"
std::string GetSubtype(const std::string& mime_string);

// Returns the MIME parameters from MIME string.
// "text/plain;charset=utf-8" => {{"charset","utf-8"}}
Parameters GetParameters(const std::string& mime_string);

// Removes parameters from a MIME string
// "text/plain;charset=utf-8" => "text/plain"
std::string RemoveParameters(const std::string& mime_string) WARN_UNUSED_RESULT;

// Appends a parameter to a MIME string.
// "text/plain" => "text/plain; charset=utf-8"
std::string AppendParameter(const std::string& mime_string,
                            const std::string& paramName,
                            const std::string& paramValue) WARN_UNUSED_RESULT;

// Returns the value of a parameter on a MIME string (empty string if missing).
// ("text/plain;charset=utf-8","charset") => "utf-8"
std::string GetParameterValue(const std::string& mime_string,
                              const std::string& paramName);

}  // namespace mime
}  // namespace buffet

#endif  // BUFFET_MIME_UTILS_H_
