import React from 'react';
import {
	ARBEIDSTIDER_INTRODUSERT_VERSJON,
	garanterListe,
	GyldighetsRegistrerer,
	ledetekst,
	minstEtTiltakErHuketAv,
	OppsummeringFeilmelding,
	OppsummeringPunkt,
	PLANTYPE_GENERELL,
	PLANTYPE_SPESIELL,
	sjekkGyldighetForTiltaksalternativer,
	useOppsummering,
	VerdiEllerInfoMangler,
} from '../..';
import { Soknad, Tiltak } from '../../domene/Soknad';
import { SlettetInformasjonsboks } from '../SlettetInformasjonsboks';
import { erTiltakEndret, erTiltakSlettet } from './tiltaksoppsummeringUtils';

function AlternativerMangler({ tittel }) {
	return (
		<div className="alternativer">
			<h5>
				<b>{tittel}</b>
			</h5>
			<span className="info-mangler">
				{`${ledetekst.getTekst(
					'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.ikkeUtfylt'
				)} ${tittel.toLowerCase()}`}
			</span>
		</div>
	);
}

function Punkter({ tiltak = {}, plantype, forrigeTiltak = {} }) {
	const {
		tiltakGenerellPlanSorterer,
		tiltakSpesiellPlanSorterer,
		forsendelsesversjon,
	} = useOppsummering();
	const sorterer =
		plantype === PLANTYPE_GENERELL
			? tiltakGenerellPlanSorterer
			: tiltakSpesiellPlanSorterer;
	const skalHaArbeidstiderIVisning =
		forsendelsesversjon >= ARBEIDSTIDER_INTRODUSERT_VERSJON;

	return Object.keys(tiltak)
		.sort(sorterer)
		.filter((key) => {
			const { valgt = false } = tiltak[key];
			return valgt;
		})
		.map((key) => {
			const { alternativer = [] } = tiltak[key];
			const tiltakstittel = ledetekst.getTekst(
				`arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.${plantype}.${key}`
			);

			const ingenAlternativerValgt =
				alternativer.length === 0 ||
				alternativer.every(({ valgt }) => !valgt);

			if (ingenAlternativerValgt) {
				return <AlternativerMangler key={key} tittel={tiltakstittel} />;
			}

			return alternativer
				.sort((a, b) => sorterer(a.felt, b.felt))
				.filter((alternativ) => alternativ?.valgt)
				.map((alternativ, index) => {
					const alternativtittel = ledetekst.getTekst(
						`arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.${plantype}.${key}.${alternativ.felt}`
					);
					const arbeidstider = garanterListe(alternativ.arbeidstider);
					const arbeidstidstekst =
						arbeidstider.length > 0 && arbeidstider.length === 2
							? 'HELE_ARBEIDSPERIODEN'
							: arbeidstider[0];

					const markerEndretTiltak = erTiltakEndret(
						forrigeTiltak,
						alternativ,
						key
					);

					return (
						<div
							className={`alternativer ${
								markerEndretTiltak
									? 'saksbehandling-redigert-informasjon-liste'
									: ''
							}`}
							key={alternativ.felt + index}
						>
							<h5>
								<b>{tiltakstittel}</b> - {alternativtittel}{' '}
								<EkstraSpoersmaalSvar alternativ={alternativ} />
							</h5>
							<pre className="util-leselengde" data-hj-suppress>
								{alternativ.tekst}
							</pre>
							{skalHaArbeidstiderIVisning &&
								(!!arbeidstidstekst ? (
									<p>
										{ledetekst.getTekst(
											`arbeidsvarsling.frontendkomponenter.Arbeidstid.${arbeidstidstekst}`
										)}
									</p>
								) : (
									<span className="info-mangler">
										{ledetekst.getTekst(
											'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.arbeidstider.ikkeUtfylt'
										)}
									</span>
								))}
						</div>
					);
				});
		});
}

function EkstraSpoersmaalSvar({ alternativ }) {
	if (!alternativ.harEkstraSpoersmaal) {
		return null;
	}
	if (alternativ.ekstraSpoersmaalValgt === undefined) {
		return <VerdiEllerInfoMangler />;
	}
	return (
		<span>
			-{' '}
			{ledetekst.getTekst(
				`arbeidsvarsling.frontendkomponenter.tiltak.vegoppmerking.ekstraSpoersmaal.${alternativ.felt}.${alternativ.ekstraSpoersmaalValgt}`
			)}
		</span>
	);
}

function Tiltaksoppsummering({ tiltak, forrigeSoknad }) {
	const { plantype, gyldighet, soknad } = useOppsummering();
	const forsendelsesversjon = parseInt(soknad.forsendelsesversjon, 10);
	const minstEtTiltakErValgt = minstEtTiltakErHuketAv(tiltak);
	const erGyldig = sjekkGyldighetForTiltaksalternativer(
		tiltak,
		forsendelsesversjon
	);
	const forrigeSoknadKopi: Soknad = structuredClone(forrigeSoknad);
	const tiltakKopi: Record<string, Tiltak> = structuredClone(tiltak);

	const skalViseFeilmelding = !erGyldig && !minstEtTiltakErValgt;

	//brukes som data for sammenligning av søknadsversjoner for å ikke markere en forskjell hvis innholdet er likt, men plantypen er ulik
	const tiltakForSammenligning =
		plantype === PLANTYPE_GENERELL
			? forrigeSoknadKopi?.vegarbeid?.vegarbeidsbeskrivelse
					?.generelleTiltak
			: forrigeSoknadKopi?.vegarbeid?.vegarbeidsbeskrivelse
					?.spesielleTiltak;

	const fjernSkisserFraAlleTiltak = (
		tiltakListe?: Record<string, Tiltak>
	) => {
		if (!tiltakListe) {
			return;
		}
		Object.values(tiltakListe).forEach((tiltak) => {
			tiltak?.alternativer?.forEach((alternativ) => {
				alternativ.vedlagteSkisserIder = [];
			});
		});
	};

	fjernSkisserFraAlleTiltak(tiltakKopi);
	fjernSkisserFraAlleTiltak(tiltakForSammenligning);

	const harSlettetTiltak =
		!!tiltakForSammenligning &&
		erTiltakSlettet(tiltakForSammenligning, tiltak);

	if (plantype === PLANTYPE_GENERELL) {
		return (
			<OppsummeringPunkt
				tittel={ledetekst.getTekst(
					'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.tittel'
				)}
				className="tiltak-oppsummering"
			>
				<OppsummeringFeilmelding
					skalVises={skalViseFeilmelding}
					tekst={ledetekst.getTekst(
						'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.ingenTiltakUtfylt'
					)}
				/>
				{/* @ts-ignore */}
				<Punkter
					tiltak={tiltakKopi}
					forrigeTiltak={tiltakForSammenligning}
					plantype={plantype}
				/>
				<GyldighetsRegistrerer
					gyldighet={gyldighet.obligatorisk()}
					erGyldig={erGyldig && minstEtTiltakErValgt}
				/>
				<SlettetInformasjonsboks
					vis={harSlettetTiltak}
					tekst={'Risikoreduserende tiltak har blitt slettet.'}
				/>
			</OppsummeringPunkt>
		);
	} else if (plantype === PLANTYPE_SPESIELL) {
		return (
			<OppsummeringPunkt
				tittel={ledetekst.getTekst(
					'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.tittel'
				)}
				className="tiltak-oppsummering"
			>
				<OppsummeringFeilmelding
					skalVises={skalViseFeilmelding}
					tekst={ledetekst.getTekst(
						'arbeidsvarsling.soknad.Vegarbeidbeskrivelse.tiltak.ingenTiltakUtfylt'
					)}
				/>
				{/* @ts-ignore */}
				<Punkter
					tiltak={tiltakKopi}
					forrigeTiltak={tiltakForSammenligning}
					plantype={plantype}
				/>
				<GyldighetsRegistrerer
					gyldighet={gyldighet.obligatorisk()}
					erGyldig={erGyldig && minstEtTiltakErValgt}
				/>
				<SlettetInformasjonsboks
					vis={harSlettetTiltak}
					tekst={'Risikoreduserende tiltak har blitt slettet.'}
				/>
			</OppsummeringPunkt>
		);
	}

	console.info(
		`Finnes ikke tiltaksoppsummering for tiltak som ikke er i plantype generell eller spesiell`
	);
	return null;
}

export default Tiltaksoppsummering;
