package atomfeed

import "fmt"

type Source struct {
	*CommonAttributes
	Authors      []*Person           `xml:"author,omitempty"`
	Categories   []*Category         `xml:"category,omitempty"`
	Contributors []*Person           `xml:"contributor,omitempty"`
	Generator    *Generator          `xml:"generator,omitempty"`
	Icon         *Icon               `xml:"icon,omitempty"`
	ID           *ID                 `xml:"id,omitempty"`
	Links        []*Link             `xml:"link,omitempty"`
	Logo         *Logo               `xml:"logo,omitempty"`
	Rights       *Text               `xml:"rights,omitempty"`
	Subtitle     *Text               `xml:"subtitle,omitempty"`
	Title        *Text               `xml:"title,omitempty"`
	Updated      *Date               `xml:"updated,omitempty"`
	Extensions   []*ExtensionElement `xml:",any,omitempty"`
}

func (s *Source) Check() error {
	if s.Authors != nil {
		for i, a := range s.Authors {
			if err := a.Check(); err != nil {
				return fmt.Errorf("author element %v of source: %v", i, err)
			}
		}
	}

	if s.Categories != nil {
		for i, c := range s.Categories {
			if err := c.Check(); err != nil {
				return fmt.Errorf("category element %v of source: %v", i, err)
			}
		}
	}

	if s.Contributors != nil {
		for i, c := range s.Contributors {
			if err := c.Check(); err != nil {
				return fmt.Errorf("contributor element %v of source: %v", i, err)
			}
		}
	}

	if s.Generator != nil {
		if err := s.Generator.Check(); err != nil {
			return fmt.Errorf("generator element of source: %v", err)
		}
	}

	if s.Icon != nil {
		if err := s.Icon.Check(); err != nil {
			return fmt.Errorf("icon element of source: %v", err)
		}
	}

	if s.ID != nil {
		if err := s.ID.Check(); err != nil {
			return fmt.Errorf("id element of source: %v", err)
		}
	}

	if s.Links != nil {
		for i, l := range s.Links {
			if err := l.Check(); err != nil {
				return fmt.Errorf("link element %v of source: %v", i, err)
			}
		}
	}

	if s.Logo != nil {
		if err := s.Logo.Check(); err != nil {
			return fmt.Errorf("logo element of source: %v", err)
		}
	}

	if s.Rights != nil {
		if err := (*s.Rights).Check(); err != nil {
			return fmt.Errorf("rights element of source: %v", err)
		}
	}

	if s.Subtitle != nil {
		if err := (*s.Subtitle).Check(); err != nil {
			return fmt.Errorf("subtitle element of source: %v", err)
		}
	}

	if s.Title != nil {
		if err := (*s.Title).Check(); err != nil {
			return fmt.Errorf("title element of source: %v", err)
		}
	}

	if s.Updated != nil {
		if err := s.Updated.Check(); err != nil {
			return fmt.Errorf("updated element of source: %v", err)
		}
	}

	if s.Extensions != nil {
		for i, e := range s.Extensions {
			if err := e.Check(); err != nil {
				return fmt.Errorf("extension element %v of source: %v", i, err)
			}
		}
	}

	return nil
}