package org.jboss.resteasy.util;

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.Cookie;

import org.jboss.resteasy.resteasy_jaxrs.i18n.Messages;

public class CookieParser {
   public static List<Cookie> parseCookies(String cookieHeader) {
      if (cookieHeader == null) throw new IllegalArgumentException(Messages.MESSAGES.cookieHeaderValueNull());
      try
      {
         List<Cookie> cookies = new ArrayList<Cookie>();

         int version = 0;
         String domain = null;
         String path = null;
         String cookieName = null;
         String cookieValue = null;

         String[] parts = cookieHeader.split("[;,]");
         for (String part : parts)
         {
            String[] nv = part.split("=", 2);
            String name = nv.length > 0 ? nv[0].trim() : "";
            String value = nv.length > 1 ? nv[1].trim() : "";
            if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1)
               value = value.substring(1, value.length() - 1);
            if (!name.startsWith("$"))
            {
               if (cookieName != null) {
                  cookies.add(new Cookie(cookieName, cookieValue, path, domain, version));
                  cookieName = cookieValue = path = domain = null;
               }

               cookieName = name;
               cookieValue = value;
            }
            else if (name.equalsIgnoreCase("$Version"))
            {
               version = Integer.parseInt(value);
            }
            else if (name.equalsIgnoreCase("$Path"))
            {
               path = value;
            }
            else if (name.equalsIgnoreCase("$Domain"))
            {
               domain = value;
            }
         }
         if (cookieName != null) {
            cookies.add(new Cookie(cookieName, cookieValue, path, domain, version));

         }
         return cookies;
      }
      catch (Exception ex)
      {
         throw new IllegalArgumentException(Messages.MESSAGES.failedToParseCookie(cookieHeader), ex);
      }
   }
}
