package permissions

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"fmt"

	"github.com/oklog/ulid/v2"
)

type Policy struct {
	ID     ulid.ULID `gorm:"primaryKey;type:bytea"`
	Name   string    `gorm:"not null"`
	RoleID ulid.ULID `gorm:"type:bytea"`          //Fremdschlüssel
	Scopes Scopes    `gorm:"type:jsonb;not null"` // JSONB-Spalte
}

// Scopes type to handle JSON marshalling
type Scopes map[string]Permission

// Scan scan value into Jsonb, implements sql.Scanner interface
func (j *Scopes) Scan(value interface{}) error {
	bytes, ok := value.([]byte)
	if !ok {
		return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
	}

	var scopes map[string]Permission
	if err := json.Unmarshal(bytes, &scopes); err != nil {
		return err
	}
	*j = scopes
	return nil
}

// Value return json value, implement driver.Valuer interface
func (j Scopes) Value() (driver.Value, error) {
	return json.Marshal(j)
}
