package main

import (
	"fmt"
	"github.com/nexuscrm/shared/pkg/models"
)

// applyPermissionCascades applies the Salesforce-style permission cascading logic:
// - When PermissionsModifyAllRecords is set to true, automatically set PermissionsViewAllRecords,
//   PermissionsRead, PermissionsCreate, PermissionsEdit, and PermissionsDelete to true
// - When PermissionsViewAllRecords is set to true, automatically set PermissionsRead to true
// - When any edit/create/delete permission is set to true, ensure PermissionsRead is true
// - When PermissionsModifyAllRecords is set to false, the dependent permissions are not unset
// - When PermissionsViewAllRecords is set to false, PermissionsRead is not unset
func applyPermissionCascades(perm models.ObjectPermissions) models.ObjectPermissions {
	// If ModifyAllRecords is being set to true, cascade to ViewAllRecords, Read, Create, Edit, Delete
	if perm.PermissionsModifyAllRecords {
		perm.PermissionsViewAllRecords = true
		perm.PermissionsRead = true
		perm.PermissionsCreate = true
		perm.PermissionsEdit = true
		perm.PermissionsDelete = true
	}

	// If ViewAllRecords is being set to true, cascade to Read
	if perm.PermissionsViewAllRecords {
		perm.PermissionsRead = true
	}

	// If any of Create, Edit, or Delete is true, ensure Read is also true
	if perm.PermissionsCreate || perm.PermissionsEdit || perm.PermissionsDelete {
		perm.PermissionsRead = true
	}

	return perm
}

func main() {
	// Test case from the original issue: when ModifyAllRecords=true, it should set ViewAllRecords=true and Delete=true
	testPerm := models.ObjectPermissions{
		PermissionsModifyAllRecords: true,
		PermissionsViewAllRecords:   false,
		PermissionsDelete:           false,
		PermissionsRead:             false,
		PermissionsCreate:           false,
		PermissionsEdit:             false,
	}
	
	fmt.Printf("Before cascade: ModifyAll=%t, ViewAll=%t, Delete=%t, Read=%t, Create=%t, Edit=%t\n", 
		testPerm.PermissionsModifyAllRecords, testPerm.PermissionsViewAllRecords, 
		testPerm.PermissionsDelete, testPerm.PermissionsRead,
		testPerm.PermissionsCreate, testPerm.PermissionsEdit)
	
	result := applyPermissionCascades(testPerm)
	
	fmt.Printf("After cascade:  ModifyAll=%t, ViewAll=%t, Delete=%t, Read=%t, Create=%t, Edit=%t\n", 
		result.PermissionsModifyAllRecords, result.PermissionsViewAllRecords, 
		result.PermissionsDelete, result.PermissionsRead,
		result.PermissionsCreate, result.PermissionsEdit)
		
	if result.PermissionsViewAllRecords && result.PermissionsDelete && result.PermissionsRead && result.PermissionsCreate && result.PermissionsEdit {
		fmt.Println("✓ Test PASSED: All cascaded permissions are correctly set")
	} else {
		fmt.Println("✗ Test FAILED: Not all permissions were cascaded properly")
	}
}
