/*
Hindsight HTTP API

HTTP API for Hindsight

API version: 0.4.17
*/

// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.

package hindsight

import (
	"encoding/json"
	"bytes"
	"fmt"
)

// checks if the FeaturesInfo type satisfies the MappedNullable interface at compile time
var _ MappedNullable = &FeaturesInfo{}

// FeaturesInfo Feature flags indicating which capabilities are enabled.
type FeaturesInfo struct {
	// Whether observations (auto-consolidation) are enabled
	Observations bool `json:"observations"`
	// Whether MCP (Model Context Protocol) server is enabled
	Mcp bool `json:"mcp"`
	// Whether the background worker is enabled
	Worker bool `json:"worker"`
	// Whether per-bank configuration API is enabled
	BankConfigApi bool `json:"bank_config_api"`
	// Whether file upload/conversion API is enabled
	FileUploadApi bool `json:"file_upload_api"`
}

type _FeaturesInfo FeaturesInfo

// NewFeaturesInfo instantiates a new FeaturesInfo object
// This constructor will assign default values to properties that have it defined,
// and makes sure properties required by API are set, but the set of arguments
// will change when the set of required properties is changed
func NewFeaturesInfo(observations bool, mcp bool, worker bool, bankConfigApi bool, fileUploadApi bool) *FeaturesInfo {
	this := FeaturesInfo{}
	this.Observations = observations
	this.Mcp = mcp
	this.Worker = worker
	this.BankConfigApi = bankConfigApi
	this.FileUploadApi = fileUploadApi
	return &this
}

// NewFeaturesInfoWithDefaults instantiates a new FeaturesInfo object
// This constructor will only assign default values to properties that have it defined,
// but it doesn't guarantee that properties required by API are set
func NewFeaturesInfoWithDefaults() *FeaturesInfo {
	this := FeaturesInfo{}
	return &this
}

// GetObservations returns the Observations field value
func (o *FeaturesInfo) GetObservations() bool {
	if o == nil {
		var ret bool
		return ret
	}

	return o.Observations
}

// GetObservationsOk returns a tuple with the Observations field value
// and a boolean to check if the value has been set.
func (o *FeaturesInfo) GetObservationsOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}
	return &o.Observations, true
}

// SetObservations sets field value
func (o *FeaturesInfo) SetObservations(v bool) {
	o.Observations = v
}

// GetMcp returns the Mcp field value
func (o *FeaturesInfo) GetMcp() bool {
	if o == nil {
		var ret bool
		return ret
	}

	return o.Mcp
}

// GetMcpOk returns a tuple with the Mcp field value
// and a boolean to check if the value has been set.
func (o *FeaturesInfo) GetMcpOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}
	return &o.Mcp, true
}

// SetMcp sets field value
func (o *FeaturesInfo) SetMcp(v bool) {
	o.Mcp = v
}

// GetWorker returns the Worker field value
func (o *FeaturesInfo) GetWorker() bool {
	if o == nil {
		var ret bool
		return ret
	}

	return o.Worker
}

// GetWorkerOk returns a tuple with the Worker field value
// and a boolean to check if the value has been set.
func (o *FeaturesInfo) GetWorkerOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}
	return &o.Worker, true
}

// SetWorker sets field value
func (o *FeaturesInfo) SetWorker(v bool) {
	o.Worker = v
}

// GetBankConfigApi returns the BankConfigApi field value
func (o *FeaturesInfo) GetBankConfigApi() bool {
	if o == nil {
		var ret bool
		return ret
	}

	return o.BankConfigApi
}

// GetBankConfigApiOk returns a tuple with the BankConfigApi field value
// and a boolean to check if the value has been set.
func (o *FeaturesInfo) GetBankConfigApiOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}
	return &o.BankConfigApi, true
}

// SetBankConfigApi sets field value
func (o *FeaturesInfo) SetBankConfigApi(v bool) {
	o.BankConfigApi = v
}

// GetFileUploadApi returns the FileUploadApi field value
func (o *FeaturesInfo) GetFileUploadApi() bool {
	if o == nil {
		var ret bool
		return ret
	}

	return o.FileUploadApi
}

// GetFileUploadApiOk returns a tuple with the FileUploadApi field value
// and a boolean to check if the value has been set.
func (o *FeaturesInfo) GetFileUploadApiOk() (*bool, bool) {
	if o == nil {
		return nil, false
	}
	return &o.FileUploadApi, true
}

// SetFileUploadApi sets field value
func (o *FeaturesInfo) SetFileUploadApi(v bool) {
	o.FileUploadApi = v
}

func (o FeaturesInfo) MarshalJSON() ([]byte, error) {
	toSerialize,err := o.ToMap()
	if err != nil {
		return []byte{}, err
	}
	return json.Marshal(toSerialize)
}

func (o FeaturesInfo) ToMap() (map[string]interface{}, error) {
	toSerialize := map[string]interface{}{}
	toSerialize["observations"] = o.Observations
	toSerialize["mcp"] = o.Mcp
	toSerialize["worker"] = o.Worker
	toSerialize["bank_config_api"] = o.BankConfigApi
	toSerialize["file_upload_api"] = o.FileUploadApi
	return toSerialize, nil
}

func (o *FeaturesInfo) UnmarshalJSON(data []byte) (err error) {
	// This validates that all required properties are included in the JSON object
	// by unmarshalling the object into a generic map with string keys and checking
	// that every required field exists as a key in the generic map.
	requiredProperties := []string{
		"observations",
		"mcp",
		"worker",
		"bank_config_api",
		"file_upload_api",
	}

	allProperties := make(map[string]interface{})

	err = json.Unmarshal(data, &allProperties)

	if err != nil {
		return err;
	}

	for _, requiredProperty := range(requiredProperties) {
		if _, exists := allProperties[requiredProperty]; !exists {
			return fmt.Errorf("no value given for required property %v", requiredProperty)
		}
	}

	varFeaturesInfo := _FeaturesInfo{}

	decoder := json.NewDecoder(bytes.NewReader(data))
	decoder.DisallowUnknownFields()
	err = decoder.Decode(&varFeaturesInfo)

	if err != nil {
		return err
	}

	*o = FeaturesInfo(varFeaturesInfo)

	return err
}

type NullableFeaturesInfo struct {
	value *FeaturesInfo
	isSet bool
}

func (v NullableFeaturesInfo) Get() *FeaturesInfo {
	return v.value
}

func (v *NullableFeaturesInfo) Set(val *FeaturesInfo) {
	v.value = val
	v.isSet = true
}

func (v NullableFeaturesInfo) IsSet() bool {
	return v.isSet
}

func (v *NullableFeaturesInfo) Unset() {
	v.value = nil
	v.isSet = false
}

func NewNullableFeaturesInfo(val *FeaturesInfo) *NullableFeaturesInfo {
	return &NullableFeaturesInfo{value: val, isSet: true}
}

func (v NullableFeaturesInfo) MarshalJSON() ([]byte, error) {
	return json.Marshal(v.value)
}

func (v *NullableFeaturesInfo) UnmarshalJSON(src []byte) error {
	v.isSet = true
	return json.Unmarshal(src, &v.value)
}


