// Code generated by go-swagger; DO NOT EDIT.

// (c) 2012-2020 by Taxnexus, Inc.
// All rights reserved worldwide.
// Proprietary product; unlicensed use is not allowed

package members_models

import (
	"context"
	"encoding/json"

	"github.com/go-openapi/errors"
	"github.com/go-openapi/strfmt"
	"github.com/go-openapi/swag/jsonutils"
	"github.com/go-openapi/validate"
)

// Brand brand
//
// swagger:model Brand
type Brand struct {
	AuditFields

	// brand key
	// Required: true
	// Max Length: 80
	// Min Length: 1
	BrandKey *string `json:"brandKey"`

	// domain
	// Required: true
	// Max Length: 255
	// Min Length: 1
	Domain *string `json:"domain"`

	// name
	// Required: true
	// Max Length: 255
	// Min Length: 1
	Name *string `json:"name"`

	// status
	// Required: true
	// Enum: ["active","inactive","retired"]
	Status *string `json:"status"`
}

// UnmarshalJSON unmarshals this object from a JSON structure
func (m *Brand) UnmarshalJSON(raw []byte) error {
	// AO0
	var aO0 AuditFields
	if err := jsonutils.ReadJSON(raw, &aO0); err != nil {
		return err
	}
	m.AuditFields = aO0

	// AO1
	var dataAO1 struct {
		BrandKey *string `json:"brandKey"`

		Domain *string `json:"domain"`

		Name *string `json:"name"`

		Status *string `json:"status"`
	}
	if err := jsonutils.ReadJSON(raw, &dataAO1); err != nil {
		return err
	}

	m.BrandKey = dataAO1.BrandKey

	m.Domain = dataAO1.Domain

	m.Name = dataAO1.Name

	m.Status = dataAO1.Status

	return nil
}

// MarshalJSON marshals this object to a JSON structure
func (m Brand) MarshalJSON() ([]byte, error) {
	_parts := make([][]byte, 0, 2)

	aO0, err := jsonutils.WriteJSON(m.AuditFields)
	if err != nil {
		return nil, err
	}
	_parts = append(_parts, aO0)
	var dataAO1 struct {
		BrandKey *string `json:"brandKey"`

		Domain *string `json:"domain"`

		Name *string `json:"name"`

		Status *string `json:"status"`
	}

	dataAO1.BrandKey = m.BrandKey

	dataAO1.Domain = m.Domain

	dataAO1.Name = m.Name

	dataAO1.Status = m.Status

	jsonDataAO1, errAO1 := jsonutils.WriteJSON(dataAO1)
	if errAO1 != nil {
		return nil, errAO1
	}
	_parts = append(_parts, jsonDataAO1)
	return jsonutils.ConcatJSON(_parts...), nil
}

// Validate validates this brand
func (m *Brand) Validate(formats strfmt.Registry) error {
	var res []error

	// validation for a type composition with AuditFields
	if err := m.AuditFields.Validate(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateBrandKey(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateDomain(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateName(formats); err != nil {
		res = append(res, err)
	}

	if err := m.validateStatus(formats); err != nil {
		res = append(res, err)
	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}

func (m *Brand) validateBrandKey(formats strfmt.Registry) error {

	if err := validate.Required("brandKey", "body", m.BrandKey); err != nil {
		return err
	}

	if err := validate.MinLength("brandKey", "body", *m.BrandKey, 1); err != nil {
		return err
	}

	if err := validate.MaxLength("brandKey", "body", *m.BrandKey, 80); err != nil {
		return err
	}

	return nil
}

func (m *Brand) validateDomain(formats strfmt.Registry) error {

	if err := validate.Required("domain", "body", m.Domain); err != nil {
		return err
	}

	if err := validate.MinLength("domain", "body", *m.Domain, 1); err != nil {
		return err
	}

	if err := validate.MaxLength("domain", "body", *m.Domain, 255); err != nil {
		return err
	}

	return nil
}

func (m *Brand) validateName(formats strfmt.Registry) error {

	if err := validate.Required("name", "body", m.Name); err != nil {
		return err
	}

	if err := validate.MinLength("name", "body", *m.Name, 1); err != nil {
		return err
	}

	if err := validate.MaxLength("name", "body", *m.Name, 255); err != nil {
		return err
	}

	return nil
}

var brandTypeStatusPropEnum []any

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["active","inactive","retired"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		brandTypeStatusPropEnum = append(brandTypeStatusPropEnum, v)
	}
}

// property enum
func (m *Brand) validateStatusEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, brandTypeStatusPropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *Brand) validateStatus(formats strfmt.Registry) error {

	if err := validate.Required("status", "body", m.Status); err != nil {
		return err
	}

	// value enum
	if err := m.validateStatusEnum("status", "body", *m.Status); err != nil {
		return err
	}

	return nil
}

// ContextValidate validate this brand based on the context it is used
func (m *Brand) ContextValidate(ctx context.Context, formats strfmt.Registry) error {
	var res []error

	// validation for a type composition with AuditFields
	if err := m.AuditFields.ContextValidate(ctx, formats); err != nil {
		res = append(res, err)
	}

	if len(res) > 0 {
		return errors.CompositeValidationError(res...)
	}
	return nil
}

// MarshalBinary interface implementation
func (m *Brand) MarshalBinary() ([]byte, error) {
	if m == nil {
		return nil, nil
	}
	return jsonutils.WriteJSON(m)
}

// UnmarshalBinary interface implementation
func (m *Brand) UnmarshalBinary(b []byte) error {
	var res Brand
	if err := jsonutils.ReadJSON(b, &res); err != nil {
		return err
	}
	*m = res
	return nil
}
