package handlers

import (
	"context"
	"service/internal/infrastructure/transport/grpc/mappers"
	"service/internal/master/role/permission"

	// Asumsi path ke proto-generated file
	permissionV1 "service/internal/infrastructure/transport/grpc/gen/permission/v1"

	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

// PermissionHandler mengimplementasikan gRPC service untuk role permission.
type PermissionHandler struct {
	permissionV1.UnimplementedRolPermissionServiceServer
	service permission.Service
}

// NewPermissionHandler membuat instance baru dari PermissionHandler.
func NewPermissionHandler(service permission.Service) *PermissionHandler {
	return &PermissionHandler{
		service: service,
	}
}

// GetRolePermissionTree adalah implementasi dari RPC.
func (h *PermissionHandler) GetRolePermissionTree(ctx context.Context, req *permissionV1.GetRolePermissionTreeRequest) (*permissionV1.RolePermissionTreeResponse, error) {
	if req == nil {
		return nil, status.Error(codes.InvalidArgument, "request cannot be nil")
	}

	// Konversi wrapper BoolValue ke pointer *bool yang diharapkan oleh service
	var activeOnly *bool
	if val := req.GetActiveOnly(); val != nil {
		b := val.GetValue()
		activeOnly = &b
	}

	tree, err := h.service.GetRolePermissionTree(ctx, req.GetRoleKeycloak(), req.GetGroupKeycloak(), activeOnly)
	if err != nil {
		return nil, handleServiceError(err)
	}

	// Menggunakan mapper untuk mengubah hasil dari service ke format proto
	protoResponse := mappers.MapRolePermissionTreeToProto(tree)

	return protoResponse, nil
}
