package controlplane

import (
	"fmt"

	clusterv3 "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
	corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
	routev3 "github.com/envoyproxy/go-control-plane/envoy/config/route/v3"

	"code.icb4dc0.de/prskr/supabase-operator/internal/supabase"
)

type PostgrestCluster struct {
	ServiceCluster
}

func (c *PostgrestCluster) Cluster(instance string) []*clusterv3.Cluster {
	if c == nil {
		return nil
	}
	return []*clusterv3.Cluster{
		c.ServiceCluster.Cluster(fmt.Sprintf("%s@%s", supabase.ServiceConfig.Postgrest.Name, instance), 3000),
	}
}

func (c *PostgrestCluster) Routes(instance string) []*routev3.Route {
	if c == nil {
		return nil
	}

	return []*routev3.Route{
		{
			Name: "PostgREST: /rest/v1/* -> http://rest:3000/*",
			Match: &routev3.RouteMatch{
				PathSpecifier: &routev3.RouteMatch_Prefix{
					Prefix: "/rest/v1/",
				},
			},
			Action: &routev3.Route_Route{
				Route: &routev3.RouteAction{
					ClusterSpecifier: &routev3.RouteAction_Cluster{
						Cluster: fmt.Sprintf("%s@%s", supabase.ServiceConfig.Postgrest.Name, instance),
					},
					PrefixRewrite: "/",
				},
			},
		},
		{
			Name: "PostgREST: /graphql/v1/* -> http://rest:3000/rpc/graphql",
			Match: &routev3.RouteMatch{
				PathSpecifier: &routev3.RouteMatch_Prefix{
					Prefix: "/graphql/v1",
				},
			},
			Action: &routev3.Route_Route{
				Route: &routev3.RouteAction{
					ClusterSpecifier: &routev3.RouteAction_Cluster{
						Cluster: fmt.Sprintf("%s@%s", supabase.ServiceConfig.Postgrest.Name, instance),
					},
					PrefixRewrite: "/rpc/graphql",
				},
			},
			RequestHeadersToAdd: []*corev3.HeaderValueOption{{
				Header: &corev3.HeaderValue{
					Key:   "Content-Profile",
					Value: "graphql_public",
				},
			}},
		},
	}
}