package main

import (
	"encoding/json"
	"log"
	"net/http"
	"net/url"
	"os"
)

type RMVResponse struct {
	Trip []Trip `json:"Trip"`
}

type Trip struct {
	LegList LegList `json:"LegList"`
}

type LegList struct {
	Leg []Leg `json:"Leg"`
}

type Leg struct {
	Type        string `json:"type"`
	Name        string `json:"name"`
	Origin      Stop   `json:"Origin"`
	Destination Stop   `json:"Destination"`
}

type Stop struct {
	Name   string `json:"name"`
	Time   string `json:"time"`
	RtTime string `json:"rtTime"`
}

type Verbindung struct {
	Linie   string
	Abfahrt string
	Ankunft string
	Von     string
	Nach    string
}

func rmv_request() {
	u, _ := url.Parse("https://www.rmv.de/hapi/trip")
	q := u.Query()
	q.Set("originId", "3018009")
	q.Set("destId", "3029164")
	q.Set("format", "json")
	q.Set("accessId", os.Getenv("RMV_API_KEY"))
	u.RawQuery = q.Encode()

	resp, err := http.Get(u.String())
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	var respData RMVResponse

	dec := json.NewDecoder(resp.Body)
	if err := dec.Decode(&respData); err != nil {
		log.Fatal(err)
	}

	var verbindungen [][]Verbindung

	for _, trip := range respData.Trip {
		var tripInfo []Verbindung

		for _, leg := range trip.LegList.Leg {
			if leg.Type == "WALK" {
				continue
			}

			abfahrt := leg.Origin.RtTime
			if abfahrt == "" {
				abfahrt = leg.Origin.Time
			}

			ankunft := leg.Destination.RtTime
			if ankunft == "" {
				ankunft = leg.Destination.Time
			}

			tripInfo = append(tripInfo, Verbindung{
				Linie:   leg.Name,
				Abfahrt: abfahrt,
				Ankunft: ankunft,
				Von:     leg.Origin.Name,
				Nach:    leg.Destination.Name,
			})
		}

		if len(tripInfo) > 0 {
			verbindungen = append(verbindungen, tripInfo)
		}

	}

	writeVerbindungToSQL(verbindungen)

	log.Println("RMV data updated")

	if err := writeVerbindungToSQL(verbindungen); err != nil {
		log.Printf("failed to persist RMV data: %v", err)
	}
}
