import React, { ReactNode } from 'react';
import {
	comparePeriode,
	garanterListe,
	GyldighetsRegistrerer,
	isPeriode,
	ledetekst,
	OppsummeringBlokk,
	OppsummeringTabell,
	periodeTilTekst,
	PERIODISERING_DAGER,
	PERIODISERING_TIMER,
	PERIODISERING_UKER,
	TYPE_DAGER_HELE_UKEN,
	TYPE_DAGER_HELG,
	TYPE_DAGER_HVERDAGER,
	useOppsummering,
	VerdiEllerInfoMangler,
} from '..';
import { Vegarbeidsperiode } from '../domene/Soknad';
import { formaterDato } from '../pynt/dato';
import { validerVegarbeidperiode } from '../validering/VegarbeidperiodeValidering';
import { TilbakemeldingForSteg } from './tilbakemelding/TilbakemeldingForSteg';
import isEqual from 'lodash/isEqual';
import { erLikeReactElementer } from './utils';

const ARBEIDSTIDER_INTRODUSERT_VERSJON = 36;

export function typeDagerTilLedetekst(typeDager) {
	switch (typeDager) {
		case TYPE_DAGER_HVERDAGER:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.arbeidsperiode.arbeidsdager.hverdag'
			);
		case TYPE_DAGER_HELG:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.arbeidsperiode.arbeidsdager.helg'
			);
		case TYPE_DAGER_HELE_UKEN:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.arbeidsperiode.arbeidsdager.heleuken'
			);
		default:
			return '';
	}
}

function periodiseringTilLedetekst(periodisering) {
	switch (periodisering) {
		case PERIODISERING_DAGER:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.varighet.dager'
			);
		case PERIODISERING_UKER:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.varighet.uker'
			);
		case PERIODISERING_TIMER:
			return ledetekst.getTekst(
				'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.varighet.timer'
			);
		default:
			return '';
	}
}

function TidPaaDoegnetOgPerioder({ vegarbeidsperiode }) {
	const { arbeidstidsperioder } = vegarbeidsperiode;
	const perioder = garanterListe(arbeidstidsperioder).filter(isPeriode);
	const { forsendelsesversjon } = useOppsummering();
	const skalHaArbeidstidsperioder =
		ARBEIDSTIDER_INTRODUSERT_VERSJON <= forsendelsesversjon;

	if (!skalHaArbeidstidsperioder) {
		return null;
	}
	return (
		<VerdiEllerInfoMangler>
			{perioder.length > 0 && (
				<ul className="liste-ustilet">
					{perioder.sort(comparePeriode).map((periode, i) => (
						<li key={JSON.stringify(periode) + i}>
							{periodeTilTekst(periode)}
						</li>
					))}
				</ul>
			)}
		</VerdiEllerInfoMangler>
	);
}

function hentDataForVegarbeidperiode(
	vegarbeidperiode: Vegarbeidsperiode
): ReactNode[] {
	const arbeidsvarighet =
		vegarbeidperiode?.arbeidsvarighet &&
		vegarbeidperiode?.arbeidsvarighet?.periodisering &&
		vegarbeidperiode?.arbeidsvarighet?.varighet &&
		vegarbeidperiode?.arbeidsvarighet;

	return [
		vegarbeidperiode?.fra ? formaterDato(vegarbeidperiode.fra) : '',
		vegarbeidperiode?.til ? formaterDato(vegarbeidperiode.til) : '',
		arbeidsvarighet
			? `${arbeidsvarighet?.varighet} ${periodiseringTilLedetekst(
					arbeidsvarighet?.periodisering
			  )}`
			: '',
		typeDagerTilLedetekst(vegarbeidperiode?.typeDager),
		<TidPaaDoegnetOgPerioder vegarbeidsperiode={vegarbeidperiode} />,
	];
}

function VegarbeidperiodeOppsummering() {
	const {
		id: soknadId,
		kunLesbar,
		vegarbeid,
		gyldighet,
		soknad,
		forrigeSoknad,
	} = useOppsummering();
	const vegarbeidperiode = vegarbeid.vegarbeidsperiode || {};

	const redigeringsLenke = !kunLesbar && `#/${soknadId}/vegarbeidperiode`;
	const valideringsfeil = !kunLesbar && validerVegarbeidperiode(soknad);

	const overskrifter = [
		'arbeidsvarsling.soknad.Oppsummering.Vegarbeidperiode.fra',
		'arbeidsvarsling.soknad.Oppsummering.Vegarbeidperiode.til',
		'arbeidsvarsling.soknad.Vegarbeidperiode.tillatelsesperiode.varighet',
		'arbeidsvarsling.soknad.Oppsummering.Vegarbeidperiode.arbeidsdager',
		'arbeidsvarsling.soknad.Oppsummering.Vegarbeidperiode.arbeidstid',
	].map(ledetekst.getTekst);

	const kolonner = hentDataForVegarbeidperiode(vegarbeidperiode);

	const data = [
		{
			kolonner: kolonner,
			markerEndring:
				!!forrigeSoknad &&
				erVegarbeidperiodeEndret(
					kolonner,
					forrigeSoknad.vegarbeid?.vegarbeidsperiode,
					vegarbeidperiode
				),
		},
	];

	return (
		<>
			<TilbakemeldingForSteg steg="vegarbeidperiode" />
			<OppsummeringBlokk
				tittel={ledetekst.getTekst(
					'arbeidsvarsling.soknad.Soknadskomponent.kulepunkter.Vegarbeidperiode'
				)}
				merknad={ledetekst.getTekst(
					'arbeidsvarsling.soknad.Vegarbeidperiode.merknad'
				)}
				redigeringsLenke={redigeringsLenke}
				valideringsfeil={valideringsfeil}
				ikon={'ikon-tid'}
			>
				<OppsummeringTabell
					overskrifter={overskrifter}
					data={data}
					kolonner={5}
					skalMaskeres={true}
				/>
				<GyldighetsRegistrerer
					gyldighet={gyldighet.obligatorisk()}
					erGyldig={!valideringsfeil}
				/>
			</OppsummeringBlokk>
		</>
	);
}

function erVegarbeidperiodeEndret(
	kolonner: any[],
	vegarbeidperiodeForrigeSoknad?: Vegarbeidsperiode,
	vegarbeidperiode?: Vegarbeidsperiode
): boolean {
	if (!vegarbeidperiodeForrigeSoknad) return true;

	const kolonnerForrigeSoknad = hentDataForVegarbeidperiode(
		vegarbeidperiodeForrigeSoknad
	);
	const endretAntallTidsperioder =
		garanterListe(vegarbeidperiode?.arbeidstidsperioder).filter(isPeriode)
			?.length !==
		garanterListe(
			vegarbeidperiodeForrigeSoknad?.arbeidstidsperioder
		).filter(isPeriode)?.length;

	const endretTidsperioder = garanterListe(
		vegarbeidperiode?.arbeidstidsperioder
	).map((periode, index) => {
		const forrigePerioder = garanterListe(
			vegarbeidperiodeForrigeSoknad?.arbeidstidsperioder
		).filter(isPeriode);

		if (index >= forrigePerioder.length) {
			return true;
		}

		return !isEqual(periode, forrigePerioder[index]);
	});

	return (
		endretAntallTidsperioder ||
		endretTidsperioder.some(Boolean) ||
		!kolonnerForrigeSoknad.every((value, indeks) => {
			if (
				indeks === 4 &&
				React.isValidElement(value) &&
				React.isValidElement(kolonner[indeks])
			) {
				return erLikeReactElementer(value, kolonner[indeks]);
			}
			return value === kolonner[indeks];
		})
	);
}

export { VegarbeidperiodeOppsummering };
