package database import ( "context" "time" ) type Triad struct { OpenMeteo float64 Caiyun float64 Imdroid float64 } // GetWeightsCurrent returns the last saved triad and its issued_at for a station. // If no row exists, returns ok=false. func GetWeightsCurrent(ctx context.Context, stationID string) (triad Triad, lastIssued time.Time, ok bool, err error) { db := GetDB() row := db.QueryRowContext(ctx, ` SELECT w_open_meteo, w_caiyun, w_imdroid, last_issued_at FROM forecast_weights_current WHERE station_id=$1`, stationID) var w1, w2, w3 float64 var li time.Time if e := row.Scan(&w1, &w2, &w3, &li); e != nil { return Triad{}, time.Time{}, false, nil } return Triad{OpenMeteo: w1, Caiyun: w2, Imdroid: w3}, li, true, nil } // UpsertWeightsCurrent saves the triad snapshot for the station. func UpsertWeightsCurrent(ctx context.Context, stationID string, triad Triad, issued time.Time) error { db := GetDB() _, err := db.ExecContext(ctx, ` INSERT INTO forecast_weights_current (station_id, w_open_meteo, w_caiyun, w_imdroid, last_issued_at, updated_at) VALUES ($1,$2,$3,$4,$5, NOW()) ON CONFLICT (station_id) DO UPDATE SET w_open_meteo=EXCLUDED.w_open_meteo, w_caiyun=EXCLUDED.w_caiyun, w_imdroid=EXCLUDED.w_imdroid, last_issued_at=EXCLUDED.last_issued_at, updated_at=NOW()`, stationID, triad.OpenMeteo, triad.Caiyun, triad.Imdroid, issued) return err }