package domain

import (
	"context"
	"time"

	"github.com/google/uuid"
)

type Role struct {
	ID          uuid.UUID  `json:"id"`
	CompanyID   *uuid.UUID `json:"company_id"`
	Name        string     `json:"name"`
	Description string     `json:"description"`
	CreatedAt   time.Time  `json:"created_at"`
	UpdatedAt   time.Time  `json:"updated_at"`
	DeletedAt   *time.Time `json:"deleted_at,omitempty"`
}

type Permission struct {
	ID          uuid.UUID `json:"id"`
	Name        string    `json:"name"`
	Description string    `json:"description"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type RolePermission struct {
	RoleID       uuid.UUID `json:"role_id"`
	PermissionID uuid.UUID `json:"permission_id"`
}

type RoleRepository interface {
	Create(ctx context.Context, role *Role) error
	GetByID(ctx context.Context, id uuid.UUID, companyID *uuid.UUID) (*Role, error)
	List(ctx context.Context, companyID *uuid.UUID, limit, offset int) ([]Role, error)
	Update(ctx context.Context, role *Role) error
	Delete(ctx context.Context, id uuid.UUID, companyID *uuid.UUID) error
	
	AssignPermission(ctx context.Context, roleID, permissionID uuid.UUID) error
	RemovePermission(ctx context.Context, roleID, permissionID uuid.UUID) error
	SyncPermissions(ctx context.Context, roleID uuid.UUID, permissionIDs []uuid.UUID) error
	GetPermissionsByRoleID(ctx context.Context, roleID uuid.UUID) ([]Permission, error)
	GetByName(ctx context.Context, name string) (*Role, error)
}

type PermissionRepository interface {
	Create(ctx context.Context, perm *Permission) error
	GetByID(ctx context.Context, id uuid.UUID) (*Permission, error)
	List(ctx context.Context, limit, offset int) ([]Permission, error)
	Update(ctx context.Context, perm *Permission) error
	Delete(ctx context.Context, id uuid.UUID) error
}

type RoleUsecase interface {
	CreateRole(ctx context.Context, role *Role) error
	GetRoleByID(ctx context.Context, id uuid.UUID, companyID *uuid.UUID) (*Role, error)
	ListRoles(ctx context.Context, companyID *uuid.UUID, limit, offset int) ([]Role, error)
	UpdateRole(ctx context.Context, id uuid.UUID, companyID *uuid.UUID, role *Role) error
	DeleteRole(ctx context.Context, id uuid.UUID, companyID *uuid.UUID) error
	
	AssignPermission(ctx context.Context, roleID, permissionID uuid.UUID, companyID *uuid.UUID) error
	RemovePermission(ctx context.Context, roleID, permissionID uuid.UUID, companyID *uuid.UUID) error
	UpdateRolePermissions(ctx context.Context, roleID uuid.UUID, permissionIDs []uuid.UUID, companyID *uuid.UUID) error
	GetRolePermissions(ctx context.Context, roleID uuid.UUID, companyID *uuid.UUID) ([]Permission, error)
}

type PermissionUsecase interface {
	CreatePermission(ctx context.Context, perm *Permission) error
	GetPermissionByID(ctx context.Context, id uuid.UUID) (*Permission, error)
	ListPermissions(ctx context.Context, limit, offset int) ([]Permission, error)
	UpdatePermission(ctx context.Context, id uuid.UUID, perm *Permission) error
	DeletePermission(ctx context.Context, id uuid.UUID) error
}
