package application

import (
	"context"
	"fmt"
	"net/http"
	"sort"

	"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
	"git.coopgo.io/coopgo-apps/parcoursmob/utils/sorting"
	agenda "git.coopgo.io/coopgo-platform/agenda/grpcapi"
	agendastorage "git.coopgo.io/coopgo-platform/agenda/storage"
	"git.coopgo.io/coopgo-platform/groups-management/storage"
	mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
	"google.golang.org/protobuf/types/known/timestamppb"
)

func (h *ApplicationHandler) Dashboard(w http.ResponseWriter, r *http.Request) {

	g := r.Context().Value(identification.GroupKey)
	if g == nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	group := g.(storage.Group)

	request := &mobilityaccounts.GetAccountsBatchRequest{
		Accountids: group.Members,
	}

	resp, err := h.services.GRPC.MobilityAccounts.GetAccountsBatch(context.TODO(), request)
	if err != nil {
		fmt.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	var accounts = []any{}

	// We only display the 10 last here
	count := len(resp.Accounts)
	min := count - 5
	if min < 0 {
		min = 0
	}

	for _, account := range resp.Accounts[min:] {
		if filterAccount(r, account) {
			a := account.ToStorageType()
			accounts = append([]any{a}, accounts...)
		}
	}

	members, _, err := h.groupmembers(group.ID)
	if err != nil {
		fmt.Println(err)
		w.WriteHeader(http.StatusInternalServerError)
		return
	}

	count_members := len(members)

	events := []agendastorage.Event{}

	eventsresp, err := h.services.GRPC.Agenda.GetEvents(context.TODO(), &agenda.GetEventsRequest{
		Namespaces: []string{"parcoursmob_dispositifs"},
		Mindate:    timestamppb.Now(),
	})

	if err == nil {
		for _, e := range eventsresp.Events {
			events = append(events, e.ToStorageType())
		}
	}

	sort.Sort(sorting.EventsByStartdate(events))

	h.Renderer.Dashboard(w, r, accounts, count, count_members, events)

}
