/*
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 "reflect"

type AssetType int64

const (
	VideoAssetType AssetType = iota
	ImageAssetType
	TitleAssetType
	HTMLAssetType
	AudioAssetType
	LumaAssetType
	UnknownAssetType
)

func (s AssetType) String() string {
	switch s { // nolint:exhaustive
	case VideoAssetType:
		return "video"
	case ImageAssetType:
		return "image"
	case TitleAssetType:
		return "title"
	case HTMLAssetType:
		return "html"
	case AudioAssetType:
		return "audio"
	case LumaAssetType:
		return "luma"

	default:
		return "unknown"
	}
}

func NewAsset(typeAsset string, obj map[string]interface{}) interface{} {
	switch typeAsset {
	case "video":
		return NewVideoAsset(obj)
	case "image":
		return NewImageAsset(obj)
	case "title":
		return NewTitleAsset(obj)
	case "html":
		return NewHTMLAsset(obj)
	case "audio":
		return NewAudioAsset(obj)
	case "luma":
		return NewLumaAsset(obj)
	}

	return nil
}

func GetAssetType(asset interface{}) AssetType {
	switch reflect.TypeOf(asset).String() {
	case "*openapi.VideoAsset":
		return VideoAssetType
	case "*openapi.ImageAsset":
		return ImageAssetType
	case "*openapi.TitleAsset":
		return TitleAssetType
	case "*openapi.HTMLAsset":
		return HTMLAssetType
	case "*openapi.AudioAsset":
		return AudioAssetType
	case "*openapi.LumaAsset":
		return LumaAssetType
	default:
		return UnknownAssetType
	}
}

// AssertAssetRequired checks if the required fields are not zero-ed
func AssertAssetRequired(obj interface{}) error {
	switch GetAssetType(obj) { // nolint:exhaustive
	case VideoAssetType:
		return AssertVideoAssetRequired(obj.(VideoAsset))
	case ImageAssetType:
		return AssertImageAssetRequired(obj.(ImageAsset))
	case TitleAssetType:
		return AssertTitleAssetRequired(obj.(TitleAsset))
	case HTMLAssetType:
		return AssertHTMLAssetRequired(obj.(HTMLAsset))
	case AudioAssetType:
		return AssertAudioAssetRequired(obj.(AudioAsset))
	case LumaAssetType:
		return AssertLumaAssetRequired(obj.(LumaAsset))
	}
	return nil
}
