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

package models

// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command

import (
	"encoding/json"

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

// Project project
//
// swagger:model Project
type Project struct {

	// allowed organizations
	AllowedOrganizations pq.StringArray `json:"AllowedOrganizations,omitempty" gorm:"column:allowedorganizations;type:text[]"`

	// linked organization
	// Format: uuid
	LinkedOrganization strfmt.UUID `json:"LinkedOrganization,omitempty" gorm:"column:linkedorganization;type:uuid"`

	// norm core hours
	NormCoreHours *int64 `json:"NormCoreHours,omitempty" gorm:"column:normcorehours;default:0"`

	// project contact email
	// Format: email
	ProjectContactEmail strfmt.Email `json:"ProjectContactEmail,omitempty" gorm:"column:projectcontactemail"`

	// project contact person
	// Format: uuid
	ProjectContactPerson strfmt.UUID `json:"ProjectContactPerson,omitempty" gorm:"column:projectcontactperson;type:uuid"`

	// project created by
	// Format: uuid
	ProjectCreatedBy strfmt.UUID `json:"ProjectCreatedBy,omitempty" gorm:"column:projectcreatedby;type:uuid"`

	// project creation time
	// Format: date-time
	ProjectCreationTime strfmt.DateTime `json:"ProjectCreationTime,omitempty" gorm:"column:projectcreationtime;type:timestamptz;default:now()"`

	// project description
	ProjectDescription string `json:"ProjectDescription,omitempty" gorm:"column:projectdescription"`

	// project domain
	ProjectDomain string `json:"ProjectDomain,omitempty" gorm:"column:projectdomain"`

	// project ID
	// Format: uuid
	ProjectID strfmt.UUID `json:"ProjectID,omitempty" gorm:"column:projectid;type:uuid;primary_key;unique;default:md5(random()::text || clock_timestamp()::text)::uuid"`

	// project max price
	ProjectMaxPrice *float64 `json:"ProjectMaxPrice,omitempty" gorm:"column:projectmaxprice;type:float8;default:0.0"`

	// project name
	ProjectName string `json:"ProjectName,omitempty" gorm:"column:projectname"`

	// project short name
	ProjectShortName string `json:"ProjectShortName,omitempty" gorm:"column:projectshortname;unique"`

	// project start date
	// Format: date-time
	ProjectStartDate strfmt.DateTime `json:"ProjectStartDate,omitempty" gorm:"column:projectstartdate;type:timestamptz"`

	// project status
	// Enum: [PENDING ACTIVE DISABLED TERMINATED]
	ProjectStatus string `json:"ProjectStatus,omitempty" gorm:"column:projectstatus"`

	// project termination date
	// Format: date-time
	ProjectTerminationDate strfmt.DateTime `json:"ProjectTerminationDate,omitempty" gorm:"column:projectterminationdate;type:timestamptz"`
}

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

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

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

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

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

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

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

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

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

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

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

func (m *Project) validateLinkedOrganization(formats strfmt.Registry) error {

	if swag.IsZero(m.LinkedOrganization) { // not required
		return nil
	}

	if err := validate.FormatOf("LinkedOrganization", "body", "uuid", m.LinkedOrganization.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectContactEmail(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectContactEmail) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectContactEmail", "body", "email", m.ProjectContactEmail.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectContactPerson(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectContactPerson) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectContactPerson", "body", "uuid", m.ProjectContactPerson.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectCreatedBy(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectCreatedBy) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectCreatedBy", "body", "uuid", m.ProjectCreatedBy.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectCreationTime(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectCreationTime) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectCreationTime", "body", "date-time", m.ProjectCreationTime.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectID(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectID) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectID", "body", "uuid", m.ProjectID.String(), formats); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectStartDate(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectStartDate) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectStartDate", "body", "date-time", m.ProjectStartDate.String(), formats); err != nil {
		return err
	}

	return nil
}

var projectTypeProjectStatusPropEnum []interface{}

func init() {
	var res []string
	if err := json.Unmarshal([]byte(`["PENDING","ACTIVE","DISABLED","TERMINATED"]`), &res); err != nil {
		panic(err)
	}
	for _, v := range res {
		projectTypeProjectStatusPropEnum = append(projectTypeProjectStatusPropEnum, v)
	}
}

const (

	// ProjectProjectStatusPENDING captures enum value "PENDING"
	ProjectProjectStatusPENDING string = "PENDING"

	// ProjectProjectStatusACTIVE captures enum value "ACTIVE"
	ProjectProjectStatusACTIVE string = "ACTIVE"

	// ProjectProjectStatusDISABLED captures enum value "DISABLED"
	ProjectProjectStatusDISABLED string = "DISABLED"

	// ProjectProjectStatusTERMINATED captures enum value "TERMINATED"
	ProjectProjectStatusTERMINATED string = "TERMINATED"
)

// prop value enum
func (m *Project) validateProjectStatusEnum(path, location string, value string) error {
	if err := validate.EnumCase(path, location, value, projectTypeProjectStatusPropEnum, true); err != nil {
		return err
	}
	return nil
}

func (m *Project) validateProjectStatus(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectStatus) { // not required
		return nil
	}

	// value enum
	if err := m.validateProjectStatusEnum("ProjectStatus", "body", m.ProjectStatus); err != nil {
		return err
	}

	return nil
}

func (m *Project) validateProjectTerminationDate(formats strfmt.Registry) error {

	if swag.IsZero(m.ProjectTerminationDate) { // not required
		return nil
	}

	if err := validate.FormatOf("ProjectTerminationDate", "body", "date-time", m.ProjectTerminationDate.String(), formats); err != nil {
		return err
	}

	return nil
}

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

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