import { z } from 'zod';
import { CompanyDatabase } from '../database/db.js';
import { SSBClient } from '../apis/ssb.js';
const ConsolidationTrendsSchema = z.object({
industry: z.string().describe("NACE-kode for bransje"),
time_period: z.enum(['1_year', '3_years', '5_years']).default('3_years'),
region: z.string().optional().describe("Region/fylke")
});
export async function analyzeConsolidation(args: unknown, db: CompanyDatabase, ssb: SSBClient) {
const params = ConsolidationTrendsSchema.parse(args);
// This is a simplified version for MVP
// Full version would track actual M&A transactions
const companies = await db.searchCompanies({
nace_code: params.industry,
municipality: params.region,
limit: 200
});
const bankruptCompanies = companies.filter(c => c.bankrupt || c.under_liquidation);
const activeCompanies = companies.filter(c => !c.bankrupt && !c.under_liquidation);
// Calculate concentration (simple Herfindahl index approximation)
const top5 = activeCompanies
.filter(c => c.employees_count)
.sort((a, b) => (b.employees_count || 0) - (a.employees_count || 0))
.slice(0, 5);
const totalEmployees = activeCompanies.reduce((sum, c) => sum + (c.employees_count || 0), 0);
const top5Employees = top5.reduce((sum, c) => sum + (c.employees_count || 0), 0);
const concentration = (top5Employees / totalEmployees) * 100;
// Fetch SSB high-growth statistics for context
let ssbHighGrowth = null;
try {
ssbHighGrowth = await ssb.getHighGrowthEnterprises(params.industry);
} catch (error) {
console.error('Error fetching SSB high-growth stats:', error);
}
const report = `
🔄 KONSOLIDERINGSTRENDS: NACE ${params.industry}
${params.region ? `📍 ${params.region}` : '🌍 Hele Norge'}
📊 MARKEDSSTATUS:
- Aktive selskaper: ${activeCompanies.length}
- Konkurs/avvikling: ${bankruptCompanies.length}
- Konkursrate: ${((bankruptCompanies.length / companies.length) * 100).toFixed(1)}%
${ssbHighGrowth ? `
📈 SSB: ${ssbHighGrowth.description}
Periode: ${ssbHighGrowth.period}
` : ''}
🎯 MARKEDSKONSENTRASJON:
- Top 5 selskaper kontrollerer: ${concentration.toFixed(1)}% av ansatte
${concentration > 60 ? '⚠️ Høy konsentrasjon - oligopol-struktur' :
concentration > 40 ? '📊 Moderat konsentrasjon' :
'✅ Lav konsentrasjon - konkurranseutsatt marked'}
🏆 DOMINERENDE AKTØRER:
${top5.map((c, idx) =>
`${idx + 1}. ${c.name}
👥 ${c.employees_count} ansatte (${((c.employees_count || 0) / totalEmployees * 100).toFixed(1)}% av marked)
📋 ${c.org_nr}`
).join('\n\n')}
${bankruptCompanies.length > 0 ? `
📉 SELSKAPER I KRISE:
${bankruptCompanies.slice(0, 5).map(c => `- ${c.name} (${c.org_nr})`).join('\n')}
${bankruptCompanies.length > 5 ? `... og ${bankruptCompanies.length - 5} flere` : ''}
` : ''}
💡 KONKLUSJON:
${concentration > 60 ? 'Markedet er høyt konsentrert. M&A-aktivitet vil trolig fortsette.' :
concentration > 40 ? 'Markedet viser tegn til konsolidering. Mindre aktører står under press.' :
'Fragmentert marked med mange små aktører. Mulighet for konsolidering.'}
ℹ️ Dette er en forenklet analyse. For detaljert M&A-tracking, bruk eksterne databaser.
`;
return {
content: [{
type: "text" as const,
text: report
}]
};
}