/*
shottower
Copyright (C) 2022 RÃ©my Boulanouar

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
 * Shottower
 *
 * Shottower is the open source version of Shotstack which is a video, image and audio editing service that allows for the automated generation of videos, images and audio using JSON and a RESTful API.  You arrange and configure an edit and POST it to the API which will render your media and provide a file  location when complete.  For more details visit [shottower](https://github.com/DblK/shottower) or checkout our [getting started](https://shotstack.io/docs/guide/) documentation.  There are two main API's, one for editing and generating assets (Edit API) and one for managing hosted assets (Serve API).  The Edit API base URL is: <b>http://0.0.0.0:4000/{version}</b>  The Serve API base URL is: <b>http://0.0.0.0:4000/serve/{version}</b>
 *
 * API version: stage
 * Generated by: OpenAPI Generator (https://openapi-generator.tech)
 */

package openapi

import "github.com/spf13/cast"

// HTMLAsset - The HTMLAsset clip type lets you create text based layout and formatting using HTML and CSS. You can also set the height and width of a bounding box for the HTML content to sit within. Text and elements will wrap within the bounding box.
type HTMLAsset struct {

	// The type of asset - set to `html` for HTML.
	Type string `json:"type"`

	// The HTML text string. See list of [supported HTML tags](https://shotstack.io/docs/guide/architecting-an-application/html-support#supported-html-tags).
	HTML string `json:"html"`

	// The CSS text string to apply styling to the HTML. See list of  [support CSS properties](https://shotstack.io/docs/guide/architecting-an-application/html-support#supported-css-properties).
	CSS string `json:"css,omitempty"`

	// Set the width of the HTML asset bounding box in pixels. Text will wrap to fill the bounding box.
	Width int32 `json:"width,omitempty"`

	// Set the width of the HTML asset bounding box in pixels. Text and elements will be masked if they exceed the  height of the bounding box.
	Height int32 `json:"height,omitempty"`

	// Apply a background color behind the HTML bounding box using. Set the text color using hexadecimal  color notation. Transparency is supported by setting the first two characters of the hex string  (opposite to HTML), i.e. #80ffffff will be white with 50% transparency.
	Background string `json:"background,omitempty"`

	// Place the HTML in one of nine predefined positions within the HTML area. <ul>   <li>`top` - top (center)</li>   <li>`topRight` - top right</li>   <li>`right` - right (center)</li>   <li>`bottomRight` - bottom right</li>   <li>`bottom` - bottom (center)</li>   <li>`bottomLeft` - bottom left</li>   <li>`left` - left (center)</li>   <li>`topLeft` - top left</li>   <li>`center` - center</li> </ul>
	Position string `json:"position,omitempty"`
}

func NewHTMLAsset(m map[string]interface{}) *HTMLAsset {
	hAsset := &HTMLAsset{
		Type: m["type"].(string),
	}

	if m["html"] != nil {
		hAsset.HTML = m["html"].(string)
	}
	if m["css"] != nil {
		hAsset.CSS = m["css"].(string)
	}
	if m["width"] != nil {
		hAsset.Width = cast.ToInt32(m["width"].(float64))
	}
	if m["height"] != nil {
		hAsset.Height = cast.ToInt32(m["height"].(float64))
	}
	if m["background"] != nil {
		hAsset.Background = m["background"].(string)
	}
	if m["position"] != nil {
		hAsset.Position = m["position"].(string)
	}
	return hAsset
}

// AssertHTMLAssetRequired checks if the required fields are not zero-ed
func AssertHTMLAssetRequired(obj HTMLAsset) error {
	elements := map[string]interface{}{
		"type": obj.Type,
		"html": obj.HTML,
	}
	for name, el := range elements {
		if isZero := IsZeroValue(el); isZero {
			return &RequiredError{Schema: "HTML Asset", Field: name}
		}
	}

	return nil
}

// AssertRecurseHTMLAssetRequired recursively checks if required fields are not zero-ed in a nested slice.
// Accepts only nested slice of HTMLAsset (e.g. [][]HTMLAsset), otherwise ErrTypeAssertionError is thrown.
func AssertRecurseHTMLAssetRequired(objSlice interface{}) error {
	return AssertRecurseInterfaceRequired(objSlice, func(obj interface{}) error {
		aHTMLAsset, ok := obj.(HTMLAsset)
		if !ok {
			return ErrTypeAssertionError
		}
		return AssertHTMLAssetRequired(aHTMLAsset)
	})
}
