package gci

// NIS2Role defines a NIS2 role classification
type NIS2Role struct {
	ID              string   `json:"id"`
	Name            string   `json:"name"`
	Description     string   `json:"description"`
	MandatoryModules []string `json:"mandatory_modules"`
	Priority        int      `json:"priority"` // 1=highest
}

// NIS2RoleAssignment represents a user's NIS2 role
type NIS2RoleAssignment struct {
	TenantID   string `json:"tenant_id"`
	UserID     string `json:"user_id"`
	UserName   string `json:"user_name"`
	RoleID     string `json:"role_id"`
	RoleName   string `json:"role_name"`
	AssignedAt string `json:"assigned_at"`
}

// NIS2 role definitions
var NIS2Roles = map[string]NIS2Role{
	"N1": {
		ID:          "N1",
		Name:        "Geschaeftsleitung",
		Description: "Leitungsorgane mit persoenlicher Haftung gemaess NIS2 Art. 20",
		Priority:    1,
		MandatoryModules: []string{
			"nis2-management",
			"nis2-risikomanagement",
			"dsgvo-grundlagen",
			"iso-isms",
		},
	},
	"N2": {
		ID:          "N2",
		Name:        "IT-Sicherheit / CISO",
		Description: "Verantwortliche fuer IT-Sicherheit und Cybersecurity",
		Priority:    2,
		MandatoryModules: []string{
			"nis2-risikomanagement",
			"nis2-incident-response",
			"nis2-supply-chain",
			"iso-zugangssteuerung",
			"iso-kryptografie",
		},
	},
	"N3": {
		ID:          "N3",
		Name:        "Kritische Funktionen",
		Description: "Mitarbeiter in kritischen Geschaeftsprozessen",
		Priority:    3,
		MandatoryModules: []string{
			"nis2-risikomanagement",
			"nis2-incident-response",
			"dsgvo-tom",
			"iso-zugangssteuerung",
		},
	},
	"N4": {
		ID:          "N4",
		Name:        "Allgemeine Mitarbeiter",
		Description: "Alle Mitarbeiter mit IT-Zugang",
		Priority:    4,
		MandatoryModules: []string{
			"nis2-risikomanagement",
			"dsgvo-grundlagen",
			"iso-isms",
		},
	},
	"N5": {
		ID:          "N5",
		Name:        "Incident Response Team",
		Description: "Mitglieder des IRT/CSIRT gemaess NIS2 Art. 21",
		Priority:    2,
		MandatoryModules: []string{
			"nis2-incident-response",
			"nis2-risikomanagement",
			"nis2-supply-chain",
			"iso-zugangssteuerung",
			"iso-kryptografie",
			"iso-isms",
		},
	},
}

// GetNIS2Role returns a NIS2 role by ID
func GetNIS2Role(roleID string) (NIS2Role, bool) {
	r, ok := NIS2Roles[roleID]
	return r, ok
}

// ListNIS2Roles returns all NIS2 roles sorted by priority
func ListNIS2Roles() []NIS2Role {
	roles := []NIS2Role{}
	// Return in priority order
	order := []string{"N1", "N2", "N5", "N3", "N4"}
	for _, id := range order {
		if r, ok := NIS2Roles[id]; ok {
			roles = append(roles, r)
		}
	}
	return roles
}

// MockNIS2RoleAssignments returns mock role assignments
func MockNIS2RoleAssignments(tenantID string) []NIS2RoleAssignment {
	return []NIS2RoleAssignment{
		{TenantID: tenantID, UserID: "user-001", UserName: "Dr. Schmidt", RoleID: "N1", RoleName: "Geschaeftsleitung", AssignedAt: "2025-06-01"},
		{TenantID: tenantID, UserID: "user-002", UserName: "M. Weber", RoleID: "N2", RoleName: "IT-Sicherheit / CISO", AssignedAt: "2025-06-01"},
		{TenantID: tenantID, UserID: "user-003", UserName: "S. Mueller", RoleID: "N5", RoleName: "Incident Response Team", AssignedAt: "2025-07-15"},
		{TenantID: tenantID, UserID: "user-004", UserName: "K. Fischer", RoleID: "N3", RoleName: "Kritische Funktionen", AssignedAt: "2025-08-01"},
		{TenantID: tenantID, UserID: "user-005", UserName: "L. Braun", RoleID: "N3", RoleName: "Kritische Funktionen", AssignedAt: "2025-08-01"},
		{TenantID: tenantID, UserID: "user-006", UserName: "A. Schwarz", RoleID: "N4", RoleName: "Allgemeine Mitarbeiter", AssignedAt: "2025-09-01"},
		{TenantID: tenantID, UserID: "user-007", UserName: "T. Wagner", RoleID: "N4", RoleName: "Allgemeine Mitarbeiter", AssignedAt: "2025-09-01"},
	}
}
