import React, { useState, useEffect } from 'react'; import { useOrg } from '../contexts/OrgContext'; import { Card, Button } from '../components/UiKit'; import { CompanyReport, Employee, Report } from '../types'; import RadarPerformanceChart from '../components/charts/RadarPerformanceChart'; import ScoreBarList from '../components/charts/ScoreBarList'; import { SAMPLE_COMPANY_REPORT } from '../constants'; interface EmployeeDataProps { mode: 'submissions' | 'reports'; } const CompanyReportCard: React.FC<{ report: CompanyReport }> = ({ report }) => { const [isExpanded, setIsExpanded] = useState(false); return (
ZM

Company Report

Last updated: {new Date(report.createdAt).toLocaleDateString()}

{/* Overview Section - Always Visible */}

Total Employees

{report.overview.totalEmployees}

Departments

{report.overview.departmentBreakdown.length}

Avg Performance

{report.overview.averagePerformanceScore}/5

Risk Level

{report.overview.riskLevel}

{isExpanded && (
{/* Key Personnel Changes */} {report.keyPersonnelChanges && report.keyPersonnelChanges.length > 0 && (

Key Personnel Changes

{report.keyPersonnelChanges.map((change, idx) => (

{change.employeeName}

{change.role} - {change.department}

{change.changeType}

{change.impact}

))}
)} {/* Immediate Hiring Needs */} {report.immediateHiringNeeds && report.immediateHiringNeeds.length > 0 && (

Immediate Hiring Needs

{report.immediateHiringNeeds.map((need, idx) => (

{need.role}

{need.urgency} priority

{need.department}

{need.reason}

))}
)} {/* Forward Operating Plan */} {report.forwardOperatingPlan && (

Forward Operating Plan

Next Quarter Goals

    {report.forwardOperatingPlan.nextQuarterGoals.map((goal, idx) => (
  • {goal}
  • ))}

Key Initiatives

    {report.forwardOperatingPlan.keyInitiatives.map((initiative, idx) => (
  • {initiative}
  • ))}
)} {/* Organizational Strengths */} {report.organizationalStrengths && report.organizationalStrengths.length > 0 && (

Organizational Strengths

{report.organizationalStrengths.map((strength, idx) => (
{strength.icon}

{strength.area}

{strength.description}

))}
)} {/* Organizational Impact Summary */} {report.organizationalImpactSummary && (

Organizational Impact Summary

{report.organizationalImpactSummary}

)} {/* Grading Overview */} {report.gradingOverview && (

Grading Overview

{Object.entries(report.gradingOverview).map(([category, score], idx) => (
{score}/5
{category.replace(/([A-Z])/g, ' $1').trim()}
))}
)}
)}
); }; const EmployeeCard: React.FC<{ employee: Employee; report?: Report; mode: 'submissions' | 'reports'; isOwner: boolean; onGenerateReport?: (employee: Employee) => void; isGeneratingReport?: boolean; }> = ({ employee, report, mode, isOwner, onGenerateReport, isGeneratingReport }) => { const [isExpanded, setIsExpanded] = useState(false); return (
{employee.initials}

{employee.name}

{employee.role} {employee.department && `• ${employee.department}`}

{employee.isOwner && ( Owner )}
{report && ( )} {isOwner && mode === 'reports' && ( )}
{isExpanded && report && (

Role & Output

{report.roleAndOutput.responsibilities}

{report.grading?.[0]?.scores && (
({ label: s.subject, value: (s.value / s.fullMark) * 100 }))} />
({ label: s.subject, value: s.value, max: s.fullMark }))} />
)}

Key Strengths

{report.insights.strengths.map((strength, idx) => ( {strength} ))}

Development Areas

{report.insights.weaknesses.map((weakness, idx) => ( {weakness} ))}

Recommendations

    {report.recommendations.map((rec, idx) => (
  • {rec}
  • ))}
)}
); }; const EmployeeData: React.FC = ({ mode }) => { const { employees, reports, user, isOwner, getFullCompanyReportHistory, generateEmployeeReport, saveReport, orgId } = useOrg(); const [companyReport, setCompanyReport] = useState(null); const [generatingReports, setGeneratingReports] = useState>(new Set()); useEffect(() => { // Load company report for owners const loadCompanyReport = async () => { if (isOwner(user?.uid || '') && mode === 'reports') { try { const history = await getFullCompanyReportHistory(); if (history.length > 0) { setCompanyReport(history[0]); } else { // Fallback to sample report if no real report exists setCompanyReport(SAMPLE_COMPANY_REPORT); } } catch (error) { console.error('Failed to load company report:', error); setCompanyReport(SAMPLE_COMPANY_REPORT); } } }; loadCompanyReport(); }, [isOwner, user?.uid, mode, getFullCompanyReportHistory]); const handleGenerateReport = async (employee: Employee) => { setGeneratingReports(prev => new Set(prev).add(employee.id)); try { console.log('Generating report for employee:', employee.name, 'in org:', orgId); // Call the API endpoint with orgId const response = await fetch(`/api/employee-report`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ employeeId: employee.id, orgId: orgId }), }); if (response.ok) { const result = await response.json(); if (result.success && result.report) { // Save the report using the context method await saveReport(employee.id, result.report); console.log('Report generated and saved successfully'); } else { console.error('Report generation failed:', result.error || 'Unknown error'); } } else { console.error('API call failed:', response.status, response.statusText); } } catch (error) { console.error('Error generating report:', error); } finally { setGeneratingReports(prev => { const newSet = new Set(prev); newSet.delete(employee.id); return newSet; }); } }; const currentUserIsOwner = isOwner(user?.uid || ''); // Filter employees based on user access const visibleEmployees = currentUserIsOwner ? employees : employees.filter(emp => emp.id === user?.uid); return (

{mode === 'submissions' ? 'Employee Submissions' : 'Employee Reports'}

{mode === 'submissions' ? 'Manage employee data and submissions' : 'View AI-generated insights and reports'}

{/* Company Report - Only visible to owners in reports mode */} {currentUserIsOwner && mode === 'reports' && companyReport && ( )} {/* Employee Cards */}

{currentUserIsOwner ? 'All Employees' : 'Your Information'}

{visibleEmployees.length === 0 ? (

No employees found.

{currentUserIsOwner && ( )}
) : ( visibleEmployees.map(employee => ( )) )}
); }; export default EmployeeData;