/*
 * Copyright (C) 2016-2021 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include "DeprecatedCSSOMPrimitiveValue.h"

#include "DeprecatedCSSOMCounter.h"
#include "DeprecatedCSSOMRGBColor.h"
#include "DeprecatedCSSOMRect.h"

namespace WebCore {
    
unsigned short DeprecatedCSSOMPrimitiveValue::primitiveType() const
{
    // FIXME: Some of these are never exposed to the web because code elsewhere prevents it. We can ASSERT_NOT_REACHED for those.
    // FIXME: Some of these should return CSS_UNKNOWN instead of hard-coded numbers not mentioned in the IDL file.

    switch (m_value->primitiveType()) {
    case CSSUnitType::CSS_ATTR:                         return CSS_ATTR;
    case CSSUnitType::CSS_CALC:                         return 113;
    case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_LENGTH:  return 115;
    case CSSUnitType::CSS_CALC_PERCENTAGE_WITH_NUMBER:  return 114;
    case CSSUnitType::CSS_CHS:                          return 109;
    case CSSUnitType::CSS_IC:                           return CSS_UNKNOWN;
    case CSSUnitType::CSS_CM:                           return CSS_CM;
    case CSSUnitType::CSS_COUNTER:                      return CSS_COUNTER;
    case CSSUnitType::CSS_COUNTER_NAME:                 return 110;
    case CSSUnitType::CSS_DEG:                          return CSS_DEG;
    case CSSUnitType::CSS_DIMENSION:                    return CSS_DIMENSION;
    case CSSUnitType::CSS_DPCM:                         return 32;
    case CSSUnitType::CSS_DPI:                          return 31;
    case CSSUnitType::CSS_DPPX:                         return 30;
    case CSSUnitType::CSS_EMS:                          return CSS_EMS;
    case CSSUnitType::CSS_EXS:                          return CSS_EXS;
    case CSSUnitType::CSS_FONT_FAMILY:                  return CSS_STRING;
    case CSSUnitType::CSS_FR:                           return 33;
    case CSSUnitType::CSS_GRAD:                         return CSS_GRAD;
    case CSSUnitType::CSS_HZ:                           return CSS_HZ;
    case CSSUnitType::CSS_IDENT:                        return CSS_IDENT;
    case CSSUnitType::CustomIdent:                      return CSS_IDENT;
    case CSSUnitType::CSS_IN:                           return CSS_IN;
    case CSSUnitType::CSS_KHZ:                          return CSS_KHZ;
    case CSSUnitType::CSS_LHS:                          return 35;
    case CSSUnitType::CSS_MM:                           return CSS_MM;
    case CSSUnitType::CSS_MS:                           return CSS_MS;
    case CSSUnitType::CSS_NUMBER:                       return CSS_NUMBER;
    case CSSUnitType::CSS_PAIR:                         return 100;
    case CSSUnitType::CSS_PC:                           return CSS_PC;
    case CSSUnitType::CSS_PERCENTAGE:                   return CSS_PERCENTAGE;
    case CSSUnitType::CSS_PROPERTY_ID:                  return CSS_IDENT;
    case CSSUnitType::CSS_PT:                           return CSS_PT;
    case CSSUnitType::CSS_PX:                           return CSS_PX;
    case CSSUnitType::CSS_Q:                            return 34;
    case CSSUnitType::CSS_QUAD:                         return 112;
    case CSSUnitType::CSS_QUIRKY_EMS:                   return 120;
    case CSSUnitType::CSS_RAD:                          return CSS_RAD;
    case CSSUnitType::CSS_RECT:                         return CSS_RECT;
    case CSSUnitType::CSS_REMS:                         return 108;
    case CSSUnitType::CSS_RGBCOLOR:                     return CSS_RGBCOLOR;
    case CSSUnitType::CSS_RLHS:                         return 36;
    case CSSUnitType::CSS_S:                            return CSS_S;
    case CSSUnitType::CSS_SHAPE:                        return 111;
    case CSSUnitType::CSS_STRING:                       return CSS_STRING;
    case CSSUnitType::CSS_TURN:                         return 107;
    case CSSUnitType::CSS_UNICODE_RANGE:                return 102;
    case CSSUnitType::CSS_UNKNOWN:                      return CSS_UNKNOWN;
    case CSSUnitType::CSS_URI:                          return CSS_URI;
    case CSSUnitType::CSS_VALUE_ID:                     return CSS_IDENT;
    case CSSUnitType::CSS_VH:                           return CSS_VH;
    case CSSUnitType::CSS_VMAX:                         return CSS_VMAX;
    case CSSUnitType::CSS_VMIN:                         return CSS_VMIN;
    case CSSUnitType::CSS_VW:                           return CSS_VW;
    case CSSUnitType::CSS_X:                            return 37;
    }

    ASSERT_NOT_REACHED();
    return CSS_UNKNOWN;
}

ExceptionOr<float> DeprecatedCSSOMPrimitiveValue::getFloatValue(unsigned short unitType) const
{
    // FIXME: Some of these values do not need to be exposed as a destination type. Remove cases below and give InvalidAccessError instead.

    switch (unitType) {
    case CSS_CM:            return m_value->getFloatValue(CSSUnitType::CSS_CM);
    case CSS_DEG:           return m_value->getFloatValue(CSSUnitType::CSS_DEG);
    case CSS_DIMENSION:     return m_value->getFloatValue(CSSUnitType::CSS_DIMENSION);
    case CSS_EMS:           return m_value->getFloatValue(CSSUnitType::CSS_EMS);
    case CSS_EXS:           return m_value->getFloatValue(CSSUnitType::CSS_EXS);
    case CSS_GRAD:          return m_value->getFloatValue(CSSUnitType::CSS_GRAD);
    case CSS_HZ:            return m_value->getFloatValue(CSSUnitType::CSS_HZ);
    case CSS_IN:            return m_value->getFloatValue(CSSUnitType::CSS_IN);
    case CSS_KHZ:           return m_value->getFloatValue(CSSUnitType::CSS_KHZ);
    case CSS_MM:            return m_value->getFloatValue(CSSUnitType::CSS_MM);
    case CSS_MS:            return m_value->getFloatValue(CSSUnitType::CSS_MS);
    case CSS_NUMBER:        return m_value->getFloatValue(CSSUnitType::CSS_NUMBER);
    case CSS_PC:            return m_value->getFloatValue(CSSUnitType::CSS_PC);
    case CSS_PERCENTAGE:    return m_value->getFloatValue(CSSUnitType::CSS_PERCENTAGE);
    case CSS_PT:            return m_value->getFloatValue(CSSUnitType::CSS_PT);
    case CSS_PX:            return m_value->getFloatValue(CSSUnitType::CSS_PX);
    case CSS_RAD:           return m_value->getFloatValue(CSSUnitType::CSS_RAD);
    case CSS_S:             return m_value->getFloatValue(CSSUnitType::CSS_S);
    case CSS_VH:            return m_value->getFloatValue(CSSUnitType::CSS_VH);
    case CSS_VMAX:          return m_value->getFloatValue(CSSUnitType::CSS_VMAX);
    case CSS_VMIN:          return m_value->getFloatValue(CSSUnitType::CSS_VMIN);
    case CSS_VW:            return m_value->getFloatValue(CSSUnitType::CSS_VW);

    case 30:                return m_value->getFloatValue(CSSUnitType::CSS_DPPX);
    case 31:                return m_value->getFloatValue(CSSUnitType::CSS_DPI);
    case 32:                return m_value->getFloatValue(CSSUnitType::CSS_DPCM);
    case 33:                return m_value->getFloatValue(CSSUnitType::CSS_FR);
    case 34:                return m_value->getFloatValue(CSSUnitType::CSS_Q);
    case 35:                return m_value->getFloatValue(CSSUnitType::CSS_LHS);
    case 36:                return m_value->getFloatValue(CSSUnitType::CSS_RLHS);
    case 37:                return m_value->getFloatValue(CSSUnitType::CSS_X);
    case 107:               return m_value->getFloatValue(CSSUnitType::CSS_TURN);
    case 108:               return m_value->getFloatValue(CSSUnitType::CSS_REMS);
    case 109:               return m_value->getFloatValue(CSSUnitType::CSS_CHS);
    case 113:               return m_value->getFloatValue(CSSUnitType::CSS_CALC);
    case 114:               return m_value->getFloatValue(CSSUnitType::CSS_CALC_PERCENTAGE_WITH_NUMBER);
    case 115:               return m_value->getFloatValue(CSSUnitType::CSS_CALC_PERCENTAGE_WITH_LENGTH);
    case 120:               return m_value->getFloatValue(CSSUnitType::CSS_QUIRKY_EMS);

    default:                return Exception { InvalidAccessError };
    }
}

ExceptionOr<String> DeprecatedCSSOMPrimitiveValue::getStringValue() const
{
    switch (primitiveType()) {
    case CSS_ATTR:      return m_value->stringValue();
    case CSS_IDENT:     return m_value->stringValue();
    case CSS_STRING:    return m_value->stringValue();
    case CSS_URI:       return m_value->stringValue();
    default:            return Exception { InvalidAccessError };
    }
}

ExceptionOr<Ref<DeprecatedCSSOMCounter>> DeprecatedCSSOMPrimitiveValue::getCounterValue() const
{
    if (primitiveType() != CSS_COUNTER)
        return Exception { InvalidAccessError };
    return DeprecatedCSSOMCounter::create(*m_value->counterValue(), m_owner);
}
    
ExceptionOr<Ref<DeprecatedCSSOMRect>> DeprecatedCSSOMPrimitiveValue::getRectValue() const
{
    if (primitiveType() != CSS_RECT)
        return Exception { InvalidAccessError };
    return DeprecatedCSSOMRect::create(*m_value->rectValue(), m_owner);
}

ExceptionOr<Ref<DeprecatedCSSOMRGBColor>> DeprecatedCSSOMPrimitiveValue::getRGBColorValue() const
{
    if (primitiveType() != CSS_RGBCOLOR)
        return Exception { InvalidAccessError };
    return DeprecatedCSSOMRGBColor::create(m_owner, m_value->color());
}

}
