package renderer
import (
	"encoding/json"
	"html/template"
	"net/http"
	groupstorage "git.coopgo.io/coopgo-platform/groups-management/storage"
	mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
	geojson "github.com/paulmach/orb/geojson"
)
const journeysMenu = "journeys"
type BeneficiariesCovoiturage struct {
	Group         string `json:"group"`
	Count         int    `json:"count"`
	CacheId       string `json:"cache_id"`
	Beneficiaries []any  `json:"beneficiaries"`
}
type BeneficiariesCovoiturageA struct {
	Count         int    `json:"count"`
	CacheId       string `json:"cache_id"`
	Beneficiaries []any  `json:"beneficiaries"`
}
func (s BeneficiariesCovoiturage) JSON() template.JS {
	result, _ := json.Marshal(s)
	return template.JS(result)
}
func (s BeneficiariesCovoiturage) JSONWithLimits(a int, b int) template.JS {
	if b < len(s.Beneficiaries) {
		s.Beneficiaries = s.Beneficiaries[a:b]
	}
	return s.JSON()
}
func (renderer *Renderer) JourneysSearch(w http.ResponseWriter, r *http.Request, carpools []*geojson.FeatureCollection, transitjourneys any, vehicles any, searched bool, departure any, destination any, departuredate string, departuretime string, driverJourneys any, solidarityDrivers any, organizedCarpools any, beneficiaries any, kbData any, passengerid string, savedSearches any, beneficiariesMap any) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.search.files")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	journeyTabs := renderer.ThemeConfig.Get("journey_tabs")
	state.ViewState = map[string]any{
		"searched":           searched,
		"departuredate":      departuredate,
		"departuretime":      departuretime,
		"departure":          departure,
		"destination":        destination,
		"journeys":           transitjourneys,
		"carpools":           carpools,
		"organized_carpools": organizedCarpools,
		"vehicles":           vehicles,
		"driver_journeys":    driverJourneys,
		"solidarity_drivers": solidarityDrivers,
		"querystring":        r.URL.RawQuery,
		"beneficiaries":      beneficiariesMap,
		"beneficiaries_list": beneficiaries,
		"kb_data":            kbData,
		"passengerid":        passengerid,
		"journey_tabs":       journeyTabs,
		"saved_searches":     savedSearches,
		"search_view":        renderer.GlobalConfig.GetString("modules.journeys.search_view"),
	}
	renderer.Render("journeys", w, r, files, state)
}
type BeneficiariesListstate struct {
	Count         int                  `json:"count"`
	CacheId       string               `json:"cache_id"`
	Beneficiaries []groupstorage.Group `json:"beneficiaries"`
}
func (s BeneficiariesListstate) JSON() template.JS {
	result, _ := json.Marshal(s)
	return template.JS(result)
}
func (s BeneficiariesListstate) JSONWithLimits(a int, b int) template.JS {
	if b < len(s.Beneficiaries) {
		s.Beneficiaries = s.Beneficiaries[a:b]
	}
	return s.JSON()
}
func (renderer *Renderer) GroupsGestion(w http.ResponseWriter, r *http.Request, groups []groupstorage.Group, cacheid string) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.list.files")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	state.ViewState = BeneficiariesListstate{
		Count:         len(groups),
		CacheId:       cacheid,
		Beneficiaries: groups,
	}
	renderer.Render("journeys", w, r, files, state)
}
func (renderer *Renderer) CreateGroup(w http.ResponseWriter, r *http.Request, depart any, arrive any, searched bool, beneficiary any, beneficiaries []mobilityaccountsstorage.Account, departure any, destination any) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.create.files")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	viewstate := map[string]any{
		"deeparture":    depart,
		"deestination":  arrive,
		"beneficiaries": beneficiaries,
		"searched":      searched,
		"departure":     departure,
		"destination":   destination,
	}
	if searched {
		viewstate["search"] = map[string]any{
			"beneficiary": beneficiary,
		}
	}
	state.ViewState = viewstate
	renderer.Render("journeys", w, r, files, state)
}
func (renderer *Renderer) DisplayGroupCovoiturage(w http.ResponseWriter, r *http.Request, number string, groupid string, depart any, arrive any, accounts []any, cacheid string, searched bool, beneficiary any, group any, beneficiaries []mobilityaccountsstorage.Account, groups map[string]any) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.display.files")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	viewstate := map[string]any{
		"beneficiaries": beneficiaries,
		"searched":      searched,
		"group":         group,
		"deeparture":    depart,
		"deestination":  arrive,
		"groups":        groups,
		"ben":           accounts,
		"number":        number,
		"list": BeneficiariesCovoiturage{
			Group:         groupid,
			Count:         len(accounts),
			CacheId:       cacheid,
			Beneficiaries: accounts,
		},
	}
	if searched {
		viewstate["search"] = map[string]any{
			"beneficiary": beneficiary,
		}
	}
	state.ViewState = viewstate
	renderer.Render("journeys", w, r, files, state)
}
func (renderer *Renderer) UpdateGroupCovoiturage(w http.ResponseWriter, r *http.Request, groupid string, memberid string) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.update.files")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	state.ViewState = map[string]any{
		"groupid":  groupid,
		"memberid": memberid,
	}
	renderer.Render("journeys", w, r, files, state)
}
func (renderer *Renderer) JourneysSearchCompact(w http.ResponseWriter, r *http.Request, carpools []*geojson.FeatureCollection, transitjourneys any, vehicles any, searched bool, departure any, destination any, departuredate string, departuretime string, driverJourneys any, solidarityDrivers any, organizedCarpools any, kbData any, passengerid string) {
	files := renderer.ThemeConfig.GetStringSlice("views.journeys.search_compact.files")
	vehicleOptionalFields := renderer.GlobalConfig.Get("modules.fleets.vehicle_optional_fields")
	state := NewState(r, renderer.ThemeConfig, journeysMenu)
	state.ViewState = map[string]any{
		"searched":                searched,
		"departuredate":           departuredate,
		"departuretime":           departuretime,
		"departure":               departure,
		"destination":             destination,
		"journeys":                transitjourneys,
		"carpools":                carpools,
		"organized_carpools":      organizedCarpools,
		"vehicles":                vehicles,
		"vehicle_optional_fields": vehicleOptionalFields,
		"driver_journeys":         driverJourneys,
		"solidarity_drivers":      solidarityDrivers,
		"kb_data":                 kbData,
		"passengerid":             passengerid,
	}
	renderer.Render("journeys", w, r, files, state)
}