// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
	"path"
	"strings"
	"time"

	"github.com/microcosm-cc/bluemonday"
	"gopkg.in/yaml.v2"
)

const (
	// eventLimit is the maximum number of events that will be output.
	eventLimit = 15
	// groupsSummaryPath is an API endpoint that returns global Go groups.
	// Fetching from this API path allows to sort groups by next upcoming event.
	groupsSummaryPath = "/pro/go/es_groups_summary?location=global&order=next_event&desc=false"
	// eventsHeader is a header comment for the output content.
	eventsHeader = `# DO NOT EDIT: Autogenerated from cmd/events.
# To update, run:
#    go run github.com/godevsite/go.dev/cmd/events > _content/events.yaml`
)

func main() {
	c := &meetupAPI{
		baseURL: "https://api.meetup.com",
	}
	ue, err := getUpcomingEvents(c)
	if err != nil {
		log.Fatal(err)
	}
	printYAML(ue)
}

type client interface {
	getGroupsSummary() (*GroupsSummary, error)
	getGroup(urlName string) (*Group, error)
}

// getUpcomingEvents returns upcoming events globally.
func getUpcomingEvents(c client) (*UpcomingEvents, error) {
	summary, err := c.getGroupsSummary()
	if err != nil {
		return nil, err
	}
	p := bluemonday.NewPolicy()
	p.AllowStandardURLs()
	p.AllowAttrs("href").OnElements("a")
	p.AllowElements("br")
	// Work around messy newlines in content.
	r := strings.NewReplacer("\n", "<br/>\n", "&lt;br&gt;", "<br/>\n")
	var events []EventData
	for _, chapter := range summary.Chapters {
		if len(events) >= eventLimit {
			break
		}
		group, err := c.getGroup(chapter.URLName)
		if err != nil || group.NextEvent == nil {
			continue
		}
		tz, err := time.LoadLocation(group.Timezone)
		if err != nil {
			tz = time.UTC
		}
		// group.NextEvent.Time is in milliseconds since UTC epoch.
		nextEventTime := time.Unix(group.NextEvent.Time/1000, 0).In(tz)
		events = append(events, EventData{
			City:              chapter.City,
			Country:           chapter.Country,
			Description:       r.Replace(p.Sanitize(chapter.Description)), // Event descriptions are often blank, use Group description.
			ID:                group.NextEvent.ID,
			LocalDate:         nextEventTime.Format("Jan 2, 2006"),
			LocalTime:         nextEventTime.Format(time.RFC3339),
			LocalizedCountry:  group.LocalizedCountryName,
			LocalizedLocation: group.LocalizedLocation,
			Name:              group.NextEvent.Name,
			PhotoURL:          chapter.GroupPhoto.PhotoLink,
			State:             chapter.State,
			ThumbnailURL:      chapter.GroupPhoto.ThumbLink,
			URL:               "https://www.meetup.com/" + path.Join(chapter.URLName, "events", group.NextEvent.ID),
		})
	}
	return &UpcomingEvents{All: events}, nil
}

type meetupAPI struct {
	baseURL string
}

func (c *meetupAPI) getGroupsSummary() (*GroupsSummary, error) {
	resp, err := http.Get(c.baseURL + groupsSummaryPath)
	if err != nil {
		return nil, fmt.Errorf("failed to get events from %q: %v", groupsSummaryPath, err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("failed to get events from %q: %v", groupsSummaryPath, resp.Status)
	}
	var summary *GroupsSummary
	d := json.NewDecoder(resp.Body)
	if err := d.Decode(&summary); err != nil {
		return summary, fmt.Errorf("failed to decode events from %q: %w", groupsSummaryPath, err)
	}
	return summary, nil
}

// getGroup fetches group details, which are useful for getting details of the next upcoming event, and timezones.
func (c *meetupAPI) getGroup(urlName string) (*Group, error) {
	u := c.baseURL + "/" + urlName
	resp, err := http.Get(u)
	if err != nil {
		return nil, fmt.Errorf("failed to fetch group details from %q: %w", u, err)
	}
	defer resp.Body.Close()
	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("failed to fetch group details from %q: %v", u, resp.Status)
	}

	var group Group
	d := json.NewDecoder(resp.Body)
	if err := d.Decode(&group); err != nil {
		return nil, fmt.Errorf("failed to decode group from %q: %w", u, err)
	}
	return &group, nil
}

func printYAML(v interface{}) {
	fmt.Println(eventsHeader)
	e := yaml.NewEncoder(os.Stdout)
	defer e.Close()
	if err := e.Encode(v); err != nil {
		log.Fatalf("failed to encode event yaml: %v", err)
	}
}

// UpcomingEvents is a list of EventData written out to YAML for rendering in Hugo.
type UpcomingEvents struct {
	All []EventData
}

// EventData is the structure written out to YAML for rendering in Hugo.
type EventData struct {
	City              string
	Country           string
	Description       string
	ID                string
	LocalDate         string `yaml:"local_date"`
	LocalTime         string `yaml:"local_time"`
	LocalizedCountry  string
	LocalizedLocation string
	Name              string
	PhotoURL          string
	State             string
	ThumbnailURL      string
	URL               string
}

// GroupsSummary is the structure returned from /pro/go/es_groups_summary.
type GroupsSummary struct {
	Chapters []*Chapter
}

type Event struct {
	Created       int    `json:"created"`
	Description   string `json:"description"`
	Duration      int    `json:"duration"`
	Fee           *Fee   `json:"fee"`
	Group         *Group `json:"group"`
	LocalDate     string `json:"local_date"`
	LocalTime     string `json:"local_time"`
	ID            string `json:"id"`
	Link          string `json:"link"`
	Name          string `json:"name"`
	RSVPLimit     int    `json:"rsvp_limit"`
	Status        string `json:"status"`
	Time          int64  `json:"time"`
	UTCOffset     int    `json:"utc_offset"`
	Updated       int    `json:"updated"`
	Venue         *Venue `json:"venue"`
	WaitlistCount int    `json:"waitlist_count"`
	YesRSVPCount  int    `json:"yes_rsvp_count"`
}

type Venue struct {
	Address1             string  `json:"address_1"`
	Address2             string  `json:"address_2"`
	Address3             string  `json:"address_3"`
	City                 string  `json:"city"`
	Country              string  `json:"country"`
	ID                   int     `json:"id"`
	Lat                  float64 `json:"lat"`
	LocalizedCountryName string  `json:"localized_country_name"`
	Lon                  float64 `json:"lon"`
	Name                 string  `json:"name"`
	Repinned             bool    `json:"repinned"`
	State                string  `json:"state"`
	Zip                  string  `json:"zip"`
}

type Group struct {
	Country              string  `json:"country"`
	Created              int     `json:"created"`
	Description          string  `json:"description"`
	ID                   int     `json:"id"`
	JoinMode             string  `json:"join_mode"`
	Lat                  float64 `json:"lat"`
	LocalizedLocation    string  `json:"localized_location"`
	LocalizedCountryName string  `json:"localized_country_name"`
	Lon                  float64 `json:"lon"`
	Name                 string  `json:"name"`
	NextEvent            *Event  `json:"next_event"`
	Region               string  `json:"region"`
	Timezone             string  `json:"timezone"`
	URLName              string  `json:"urlname"`
	Who                  string  `json:"who"`
}

type Fee struct {
	Accepts     string  `json:"accepts"`
	Amount      float64 `json:"amount"`
	Currency    string  `json:"currency"`
	Description string  `json:"description"`
	Label       string  `json:"label"`
	Required    bool    `json:"required"`
}

type Chapter struct {
	AverageAge     float64        `json:"average_age"`
	Category       []Category     `json:"category"`
	City           string         `json:"city"`
	Country        string         `json:"country"`
	Description    string         `json:"description"`
	FoundedDate    int64          `json:"founded_date"`
	GenderFemale   float64        `json:"gender_female"`
	GenderMale     float64        `json:"gender_male"`
	GenderOther    float64        `json:"gender_other"`
	GenderUnknown  float64        `json:"gender_unknown"`
	GroupPhoto     GroupPhoto     `json:"group_photo"`
	ID             int            `json:"id"`
	LastEvent      int64          `json:"last_event"`
	Lat            float64        `json:"lat"`
	Lon            float64        `json:"lon"`
	MemberCount    int            `json:"member_count"`
	Name           string         `json:"name"`
	NextEvent      int64          `json:"next_event"`
	OrganizerPhoto OrganizerPhoto `json:"organizer_photo"`
	Organizers     []Organizer    `json:"organizers"`
	PastEvents     int            `json:"past_events"`
	PastRSVPs      int            `json:"past_rsvps"`
	ProJoinDate    int64          `json:"pro_join_date"`
	RSVPsPerEvent  float64        `json:"rsvps_per_event"`
	RepeatRSVPers  int            `json:"repeat_rsvpers"`
	State          string         `json:"state"`
	Status         string         `json:"status"`
	Topics         []Topic        `json:"topics"`
	URLName        string         `json:"urlname"`
	UpcomingEvents int            `json:"upcoming_events"`
}

type Topic struct {
	ID     int    `json:"id"`
	Name   string `json:"name"`
	URLkey string `json:"urlkey"`
	Lang   string `json:"lang"`
}

type Category struct {
	ID        int    `json:"id"`
	Name      string `json:"name"`
	Shortname string `json:"shortname"`
	SortName  string `json:"sort_name"`
}

type Organizer struct {
	Name       string `json:"name"`
	MemberID   int    `json:"member_id"`
	Permission string `json:"permission"`
}

type OrganizerPhoto struct {
	BaseURL     string `json:"base_url"`
	HighresLink string `json:"highres_link"`
	ID          int    `json:"id"`
	PhotoLink   string `json:"photo_link"`
	ThumbLink   string `json:"thumb_link"`
	Type        string `json:"type"`
}

type GroupPhoto struct {
	BaseURL     string `json:"base_url"`
	HighresLink string `json:"highres_link"`
	ID          int    `json:"id"`
	PhotoLink   string `json:"photo_link"`
	ThumbLink   string `json:"thumb_link"`
	Type        string `json:"type"`
}
