Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
gdd_service.go 3.14 KiB
package services

import (
	"time"

	"github.com/tgs266/dawn-go-common/common"
	"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models"
	"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/models/enums"
	"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence"
	"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/persistence/entities"
	"gitlab.cs.umd.edu/dawn/go-backend/dawn-gdd/utils"
	"gonum.org/v1/gonum/stat"
)

func GetFullYearGddValues(ctx common.DawnCtx, request models.GddRequest) models.GddResponse {
	product := enums.GetProductFromString(request.Product)
	var gdds entities.Gdd
	if request.Year == time.Now().Year() {
		gdds = persistence.CurrentGddFindFirstByYearAndLocation(ctx, request.BuildLocation())
		gdds2 := persistence.CfsFindAllByLocation(request.BuildLocation())
		gdds.MaxTemps = append(gdds.MaxTemps, gdds2.MaxTemps...)
		gdds.MinTemps = append(gdds.MinTemps, gdds2.MinTemps...)
	} else {
		gdds = persistence.GddFindFirstByYearAndLocation(request.Year, request.BuildLocation())
	}
	returnGdds := models.GddResponse{
		Product:          product.Name,
		ClosestLatitude:  gdds.Location.Coordinates[1],
		ClosestLongitude: gdds.Location.Coordinates[0],
		GddValues:        utils.CalculateGddValues(gdds.MinTemps, gdds.MaxTemps, product, request.Accumulate),
		LastDate:         gdds.LastDate.Time(),
	}
	return returnGdds
}

func GetGddValues(ctx common.DawnCtx, request models.GddRequest) models.GddResponse {
	product := enums.GetProductFromString(request.Product)
	var gdds entities.Gdd
	if request.Year == time.Now().Year() {
		gdds = persistence.CurrentGddFindFirstByYearAndLocation(ctx, request.BuildLocation())
	} else {
		gdds = persistence.GddFindFirstByYearAndLocation(request.Year, request.BuildLocation())
	}

	if !request.PlantingDate.IsZero() && request.Year >= time.Now().Year() {
		pdInt := request.PlantingDate.YearDay() - 1
		gdds.MaxTemps = gdds.MaxTemps[pdInt:]
		gdds.MinTemps = gdds.MinTemps[pdInt:]
	}

	returnGdds := models.GddResponse{
		Product:          product.Name,
		ClosestLatitude:  gdds.Location.Coordinates[1],
		ClosestLongitude: gdds.Location.Coordinates[0],
		GddValues:        utils.CalculateGddValues(gdds.MinTemps, gdds.MaxTemps, product, request.Accumulate),
		LastDate:         gdds.LastDate.Time(),
	}
	return returnGdds
}

func GetNormalValues(request models.GddRequest) models.GddResponse {
	product := enums.GetProductFromString(request.Product)
	gs := persistence.GetLastNormalsYearly(request.BuildLocation())
	var returnGdds models.GddResponse
	var gdds []float64
	rows := [][]float64{}
	for i := 0; i < len(gs[0].MinTemps); i++ { //; i++ {
		row := []float64{}
		for j := 0; j < len(gs); j++ {
			row = append(row, utils.CalculateSingleGdd(gs[j].MinTemps[i], gs[j].MaxTemps[i], product))
			if request.Accumulate && i > 0 {
				row[j] += rows[len(rows)-1][j]
			}
		}
		rows = append(rows, row)
		mean := stat.Mean(row, nil)
		gdds = append(gdds, mean)
	}

	returnGdds = models.GddResponse{
		Product:          product.Name,
		ClosestLatitude:  gs[0].Location.Coordinates[1],
		ClosestLongitude: gs[0].Location.Coordinates[0],
		GddValues:        gdds,
	}

	return returnGdds
}