package grpcserver

import (
	mcdslgrpc "git.wntrmute.dev/mc/mcdsl/grpcserver"
)

// methodMap builds the mcdsl grpcserver.MethodMap for MCR.
//
// Adding a new RPC without adding it to the correct map is a security
// defect -- the mcdsl auth interceptor denies unmapped methods by default.
func methodMap() mcdslgrpc.MethodMap {
	return mcdslgrpc.MethodMap{
		Public:        publicMethods(),
		AuthRequired:  authRequiredMethods(),
		AdminRequired: adminRequiredMethods(),
	}
}

// publicMethods returns methods that require no authentication.
// Health is the only public RPC.
func publicMethods() map[string]bool {
	return map[string]bool{
		"/mcr.v1.AdminService/Health": true,
	}
}

// authRequiredMethods returns methods that require a valid MCIAS token
// but not the admin role.
func authRequiredMethods() map[string]bool {
	return map[string]bool{
		"/mcr.v1.RegistryService/ListRepositories": true,
		"/mcr.v1.RegistryService/GetRepository":    true,
	}
}

// adminRequiredMethods returns methods that require a valid MCIAS token
// with the admin role.
func adminRequiredMethods() map[string]bool {
	return map[string]bool{
		// Registry admin operations.
		"/mcr.v1.RegistryService/DeleteRepository": true,
		"/mcr.v1.RegistryService/GarbageCollect":   true,
		"/mcr.v1.RegistryService/GetGCStatus":      true,

		// Policy management -- all RPCs require admin.
		"/mcr.v1.PolicyService/ListPolicyRules":  true,
		"/mcr.v1.PolicyService/CreatePolicyRule": true,
		"/mcr.v1.PolicyService/GetPolicyRule":    true,
		"/mcr.v1.PolicyService/UpdatePolicyRule": true,
		"/mcr.v1.PolicyService/DeletePolicyRule": true,

		// Audit -- requires admin.
		"/mcr.v1.AuditService/ListAuditEvents": true,
	}
}
