package main

import (
	"context"

	"code.hackerspace.pl/hscloud/hswaw/site/calendar"
	"github.com/golang/glog"
)

// SpaceAPIResponse, per https://spaceapi.io/ - kinda. Mostly rewritten from
// old implementation, someone should update this to use the official schema.
type SpaceAPIResponse struct {
	API                 string                      `json:"api"`
	Space               string                      `json:"space"`
	Logo                string                      `json:"logo"`
	URL                 string                      `json:"url"`
	Location            SpaceAPILocation            `json:"location"`
	State               SpaceAPIState               `json:"state"`
	Contact             map[string]string           `json:"contact"`
	IssueReportChannels []string                    `json:"issue_report_channels"`
	Projects            []string                    `json:"projects"`
	Feeds               map[string]SpaceAPIFeed     `json:"feeds"`
	Sensors             map[string][]SpaceAPISensor `json:"sensors"`
}

type SpaceAPILocation struct {
	Latitude  float64 `json:"lat"`
	Longitude float64 `json:"lon"`
	Address   string  `json:"address"`
}

type SpaceAPIState struct {
	Open    bool   `json:"open"`
	Message string `json:"message"`
	Icon    struct {
		Open   string `json:"open"`
		Closed string `json:"closed"`
	} `json:"icon"`
}

type SpaceAPIFeed struct {
	Type string `json:"type"`
	URL  string `json:"url"`
}

type SpaceAPISensor struct {
	Value int      `json:"value"`
	Names []string `json:"names"`
}

func generateSpaceAPIResponse(ctx context.Context) SpaceAPIResponse {
	state := SpaceAPIState{}
	state.Icon.Open = "https://static.hackerspace.pl/img/status-open-small.png"
	state.Icon.Closed = "https://static.hackerspace.pl/img/status-closed-small.png"
	// TODO(q3k): post-coronavirus, make automatically open based on calendar
	// events and Open Thursdays.
	open := false
	if open {
		state.Open = true
		state.Message = "open for public"
	} else {
		state.Open = false
		state.Message = "members only"
	}

	peopleNowPresent := SpaceAPISensor{}
	atState, err := getAt(ctx)
	if err != nil {
		glog.Errorf("Failed to get checkinator status: %v", err)
	} else {
		peopleNowPresent.Names = make([]string, len(atState.Users))
		for i, u := range atState.Users {
			peopleNowPresent.Names[i] = u.Login
		}
		peopleNowPresent.Value = len(peopleNowPresent.Names)
	}

	res := SpaceAPIResponse{
		API:   "0.13",
		Space: "Warsaw Hackerspace",
		Logo:  "https://static.hackerspace.pl/img/syrenka-black.png",
		URL:   "https://hackerspace.pl",
		Location: SpaceAPILocation{
			Latitude:  52.24160,
			Longitude: 20.98485,
			Address:   "ul. Wolność 2A, 01-018 Warszawa, Poland",
		},
		State: state,
		Contact: map[string]string{
			"irc":      "irc://irc.libera.chat/#hswaw",
			"twitter":  "@hackerspacepl",
			"facebook": "hackerspacepl",
			"ml":       "waw@lists.hackerspace.pl",
		},
		IssueReportChannels: []string{"irc"},
		Projects: []string{
			"https://wiki.hackerspace.pl/projects",
		},
		Feeds: map[string]SpaceAPIFeed{
			"blog": SpaceAPIFeed{
				Type: "atom",
				URL:  feedsURLs["blog"],
			},
			"calendar": SpaceAPIFeed{
				Type: "ical",
				URL:  calendar.EventsURL,
			},
			"wiki": SpaceAPIFeed{
				Type: "rss",
				URL:  "https://wiki.hackerspace.pl/feed.php",
			},
		},
		Sensors: map[string][]SpaceAPISensor{
			"people_now_present": []SpaceAPISensor{peopleNowPresent},
		},
	}

	return res
}
