package structs

import "math"

// In Go interface resolution is implicit. So Rectangle and Cirle have
// receiver functions that satisfy the Shape interface.
type Shape interface {
	Area() float64
}

type Rectangle struct {
	Width  float64
	Height float64
}

type Circle struct {
	Radius float64
}

type Triangle struct {
	Base   float64
	Height float64
}

// There are examples of functions (not methods)
// Perimeter calculates the perimeter of a rectangle
func Perimeter(rectangle Rectangle) float64 {
	return 2 * (rectangle.Width + rectangle.Height)
}

// Area calculates the area of a rectangle
func Area(rectangle Rectangle) float64 {
	return rectangle.Width * rectangle.Height
}

// A method is a function with a receiver. A method declaration binds an identifier,
// the method name, to a method, and associates the method with the receiver's base type.
func (r Rectangle) Area() float64 {
	return r.Height * r.Width
}

func (c Circle) Area() float64 {
	return math.Pow(c.Radius, 2) * math.Pi
}

func (t Triangle) Area() float64 {
	// return (t.Base * t.Height) / 2
	return (t.Base * t.Height) * 0.5
}
