import { useState } from 'react'; import { assessmentReady, diagnosticReady, forceLabels, forces, newCompetitivenessDraft, readCompetitivenessDraft, } from '@/lib/cluster-competitiveness'; import type { Assessment, CompetitivenessDraft, Force, } from '@/lib/cluster-competitiveness'; import { button, control } from '../management/shared'; const labels = { evidence: 'Observações e evidências locais', source: 'Fonte e referência recuperável (documento, página ou endereço)', period: 'Período dos dados e data da consulta', rationale: 'Justificação da pressão atribuída', limitations: 'Limitações, cobertura e pressupostos', opportunity: 'Oportunidade de investimento e fundamento', } as const; export default function Competitiveness({ clusterId, sector, }: { clusterId: string; sector: string; }) { const [draft, setDraft] = useState(() => newCompetitivenessDraft(clusterId, sector), ); const [pending, setPending] = useState(null); const [message, setMessage] = useState(''); function change(force: Force, field: keyof Assessment, value: string) { setDraft((previous) => ({ ...previous, forces: { ...previous.forces, [force]: { ...previous.forces[force], [field]: value }, }, })); } function download() { const url = URL.createObjectURL( new Blob([JSON.stringify(draft, null, 2)], { type: 'application/json', }), ); const link = document.createElement('a'); link.href = url; link.download = `competitividade-${clusterId}.json`; link.click(); setTimeout(() => URL.revokeObjectURL(url), 1000); setMessage( 'Ficheiro preparado para transferência. Conserve-o para recuperar a análise.', ); } return (

Competitividade — cinco forças de Porter

Análise qualitativa por sector e região ligada a este cluster. Descreva as evidências e justifique cada pressão; não existe pontuação automática nem média entre forças.

Rascunho nesta página: transfira o ficheiro antes de sair. Não é gravado no servidor nem publicado. A classificação representa a apreciação do autor.

{draft.sector !== sector && (

O sector da análise difere do sector actual do cluster ( {sector}). Confira o âmbito antes de reutilizar conclusões.

)}

{diagnosticReady(draft) ? 'Cinco forças preenchidas para revisão; fontes e conclusões requerem leitura do autor.' : 'Diagnóstico incompleto: indique o âmbito e complete as evidências das cinco forças.'}

{forces.map((force) => (
{forceLabels[force]} ·{' '} {assessmentReady(draft.forces[force]) ? 'Preenchida para revisão' : 'Indeterminada / incompleta'}
{Object.entries(labels).map(([field, label]) => (