// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.

#pragma once

/** @file

 A CSSProperties object represents a set of name/value pairs, corresponding to the properties
 defined in a CSS rule.

 When dealing with CSS rules, we make a distinction between **collapsed** and **expanded**
 properties. Collapsed properties use shorthand notation to define multiple expanded properties in
 a single go; for example, the `border-width` shorthand property actually defines
 `border-left-width`, `border-right-width`, `border-top-width`, and `border-bottom-width`
 properties. In the expanded representation, each of the latter properties four is represented
 individually. The functions CSSExpandProperties and CSSCollapseProperties convert between the
 collapsed and expanded representations.

 In addition to CSS shorthand rules, we also expand certain properties like `text-decoration`. In
 CSS, the `text-decoration` property consists of zero or more decoration values, namely `underline`,
 `overline`, and `line-through`. In order to facilitate setting or clearing these values
 individually, CSSProperties uses an expanded representation in which `text-decoration` is split
 into three distinct properties - `text-decoration-underline`, `text-decoration-overline`, and
 `text-decoration-line-through`. When the properties are collapsed using CSSCollapseProperties, the
 values of these properties (where set) are all merged into a single `text-decoration` property.

 @see CSSSheet.h
 @see CSSStyle.h

 */

#include "DFCallback.h"
#include "DFHashTable.h"

typedef struct CSSProperties CSSProperties;

struct CSSProperties {
    int retainCount;
    DFCallback *changeCallbacks;
    DFHashTable *hashTable;
    int dirty;
};

/**
 Returns a textual representation of the properties, in collapsed form. The resulting string can be
 used as the value of a HTML `style` attribute, to specify direct formatting for an element.

 The string returned by this function is newly-allocated, and must be freed by the caller.
 */
char *CSSPropertiesCopyDescription(CSSProperties *properties);

/**
 Retrieve a NULL-terminated array of all the property names set on this object. This array can still
 be used safely after changes to the object, as it contains its own copy of the names.

 The returned array is newly-allocated, and must be freed by the caller. The strings are allocated
 in the same block of memory as the array itself, so a single call to `free` is sufficient.

 @see DFHashTableCopyKeys()
 */
const char **CSSPropertiesCopyNames(CSSProperties *properties);

int CSSPropertiesIsEmpty(CSSProperties *properties);

/**
 Retrieve the value of the property with the specified name. If the property is not set, this
 function returns NULL.
 */
const char *CSSGet(CSSProperties *properties, const char *name);

/**
 Set or clear a property. If the value is non-NULL, then the property is set, replacing any previous
 value that might have been present. If the value is NULL, then the property is removed.
 */
void CSSPut(CSSProperties *properties, const char *name, const char *value);

/**
 Replace all properties in this object with those from the `raw` hash table, which contains
 collapsed properties. This function first expands the properties, as described above, and then
 sets the individual expanded properties on this object.
 */
void CSSPropertiesUpdateFromRaw(CSSProperties *properties, DFHashTable *raw);

int CSSGetBold(CSSProperties *properties);
int CSSGetItalic(CSSProperties *properties);
int CSSGetUnderline(CSSProperties *properties);
int CSSGetLinethrough(CSSProperties *properties);
int CSSGetOverline(CSSProperties *properties);
int CSSGetDefault(CSSProperties *properties);

void CSSSetBold(CSSProperties *properties, int value);
void CSSSetItalic(CSSProperties *properties, int value);
void CSSSetUnderline(CSSProperties *properties, int value);
void CSSSetLinethrough(CSSProperties *properties, int value);
void CSSSetOverline(CSSProperties *properties, int value);
void CSSSetDefault(CSSProperties *properties, int value);

void CSSPropertiesPrint(CSSProperties *properties, const char *indent);

CSSProperties *CSSPropertiesNewWithExtra(CSSProperties *orig, const char *string);
CSSProperties *CSSPropertiesNewWithRaw(DFHashTable *raw);
CSSProperties *CSSPropertiesNewWithString(const char *string);
CSSProperties *CSSPropertiesNew(void);

CSSProperties *CSSPropertiesRetain(CSSProperties *properties);
void CSSPropertiesRelease(CSSProperties *properties);
