import React from 'react';

import {
	AKTORTYPE_ANSVARSHAVENDE,
	AKTORTYPE_BYGGHERRE,
	AKTORTYPE_STEDSANSVARLIG,
	AKTORTYPE_UTFOERENDE_ENTREPRENOER,
	AKTORTYPE_UTFOERENDE_ENTREPRENOER_VARSLING,
	GyldighetsRegistrerer,
	KompetansebevisSomObjektUtlopsvisning,
	ledetekst,
	OppsummeringBlokk,
	OppsummeringPunkt,
	OppsummeringTabell,
	useOppsummering,
	VerdiEllerInfoMangler,
} from '..';
import { validerKontaktinformasjon } from '../validering/KontaktinformasjonValidering';
import { TilbakemeldingForSteg } from './tilbakemelding/TilbakemeldingForSteg';
import { erLikeReactElementer } from './utils';
import { SlettetInformasjonsboks } from './SlettetInformasjonsboks';

const ANSVARLIG_VARSLING_EPOSTADRESSE_INTRODUSERT_VERSJON = 30;

function UtforerOppsummering(props) {
	let { utforer, utforerVarsling, forrigeSoknad } = props;
	utforer = utforer || {};
	utforerVarsling = utforerVarsling || {};

	const { soknad } = useOppsummering();
	const forsendelsesversjon = parseInt(soknad.forsendelsesversjon, 10);

	const overskrifter = [
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.entrepenoerer.utfoerende'
		),
		' ',
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.entrepenoerer.arbeidsvarsling'
		),

		skalHaEpostadresseAnsvarligVarsling(forsendelsesversjon)
			? ledetekst.getTekst(
					'arbeidsvarsling.soknad.Kontaktinformasjon.entrepenoerer.arbeidsvarsling.epostadresse'
			  )
			: ' ',
	];

	const kolonner = hentUtforerInformasjon(
		utforer,
		utforerVarsling,
		forsendelsesversjon
	);

	const data = [
		{
			kolonner: kolonner,
			markerEndring:
				!!forrigeSoknad &&
				erUtforerEndret(
					kolonner,
					forsendelsesversjon,
					forrigeSoknad?.vegarbeid?.kontakter
				),
		},
	];

	return (
		<OppsummeringPunkt
			tittel={ledetekst.getTekst(
				'arbeidsvarsling.soknad.Kontaktinformasjon.entrepenoerer.overskrift'
			)}
		>
			<OppsummeringTabell
				overskrifter={overskrifter}
				data={data}
				kolonner={4}
				className={'kontaktinformasjon'}
				skalMaskeres
			/>
		</OppsummeringPunkt>
	);
}

function hentUtforerInformasjon(
	utforer: any,
	utforerVarsling: any,
	forsendelsesversjon: number
): string[] {
	const utforerTekst =
		utforer.navn || utforer.organisasjonsnummer
			? `${utforer.navn} (${utforer.organisasjonsnummer?.identifikator})`
			: '';
	const utforerVarslingTekst =
		utforerVarsling.navn || utforerVarsling.organisasjonsnummer
			? `${utforerVarsling.navn} (${utforerVarsling.organisasjonsnummer?.identifikator})`
			: '';
	const utforerVarslingEpostadresse = skalHaEpostadresseAnsvarligVarsling(
		forsendelsesversjon
	)
		? getEpostadresseAnsvarligVarsling(utforerVarsling)
		: ' '; // Streng med mellomrom slik at vi ikke får "Mangler" i oppsummeringen

	return [
		utforerTekst,
		' ',
		utforerVarslingTekst,
		utforerVarslingEpostadresse,
	];
}

function erUtforerEndret(
	kolonner: string[],
	forsendelsesversjon: number,
	kontakter?: any[]
): boolean {
	const utforerForrigeSoknad =
		getEnAktorEtterType(kontakter, AKTORTYPE_UTFOERENDE_ENTREPRENOER) || {};
	const utforerVarslingForrigeSoknad =
		getEnAktorEtterType(
			kontakter,
			AKTORTYPE_UTFOERENDE_ENTREPRENOER_VARSLING
		) || {};

	const kolonnerForrigeSoknad = hentUtforerInformasjon(
		utforerForrigeSoknad,
		utforerVarslingForrigeSoknad,
		forsendelsesversjon
	);

	return !kolonnerForrigeSoknad.every(
		(value, indeks) => value === kolonner[indeks]
	);
}

function erAnsvarligPersonEndret(
	kolonner: any[],
	lastNedVedleggUrl: (id: string) => string,
	lastNedVedlegg: (vedleggId: string, lastNedAutomatisk: boolean) => void,
	kontakter?: any[],
	aktortype?: any
): boolean {
	if (!kontakter) return true;

	const kontakterForrigeSoknad = getAlleAktorerEtterType(
		kontakter,
		aktortype
	);

	return !kontakterForrigeSoknad?.some((person) => {
		person = person || {};
		const kontaktinformasjon = person.kontaktinformasjon || {};
		const kompetansebevis = person.kompetansebevis;

		const kolonnerForrigeSoknad = [
			person.navn,
			kontaktinformasjon.mobiltelefonnummer,
			kontaktinformasjon.epostadresse,
			<KompetansebevisSomObjektUtlopsvisning
				kompetansebevis={kompetansebevis}
				lastNedVedleggUrl={lastNedVedleggUrl}
				lastNedVedlegg={lastNedVedlegg}
			/>,
		];

		return kolonnerForrigeSoknad.every((value, indeks) => {
			if (
				indeks === 3 &&
				React.isValidElement(value) &&
				React.isValidElement(kolonner[indeks])
			) {
				return erLikeReactElementer(value, kolonner[indeks]);
			}
			return value === kolonner[indeks];
		});
	});
}

function BekreftelsePaKompetanseForStedsansvarlig(props) {
	const { kunLesbar, erKompetanseBekreftet } = props;

	// Viser alltid bekreftelsesmelding i lesemodus (for å støtte eldre søknader uten erKompetanseBekreftet feltet)
	const skalViseBekreftelsesTekst = erKompetanseBekreftet || kunLesbar;

	return (
		<OppsummeringPunkt
			tittel={ledetekst.getTekst(
				'arbeidsvarsling.soknad.Kontaktinformasjon.stedsansvarlige.kompetansebevis.bekreftelse.tittel'
			)}
		>
			<VerdiEllerInfoMangler>
				{skalViseBekreftelsesTekst
					? ledetekst.getTekst(
							'arbeidsvarsling.soknad.Kontaktinformasjon.stedsansvarlige.kompetansebevis.bekreftelse.tekst.lesemodus'
					  )
					: undefined}
			</VerdiEllerInfoMangler>
		</OppsummeringPunkt>
	);
}

function AnsvarligePersonerOppsummering(props) {
	const {
		personer,
		tittel,
		lastNedVedleggUrl,
		lastNedVedlegg,
		forrigeSoknad,
		aktortype,
	} = props;

	const overskrifter = [
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.navn'
		),
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.mobiltelefon'
		),
		...(aktortype !== AKTORTYPE_STEDSANSVARLIG
			? [
					ledetekst.getTekst(
						'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.epost'
					),
					ledetekst.getTekst(
						'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.kompetansebevis'
					),
			  ]
			: []),
	];

	let data = personer.map((person) => {
		person = person || {};
		const kontaktinformasjon = person.kontaktinformasjon || {};
		const kompetansebevis = person.kompetansebevis;

		const kolonner =
			aktortype === AKTORTYPE_STEDSANSVARLIG
				? [person.navn, kontaktinformasjon.mobiltelefonnummer]
				: [
						person.navn,
						kontaktinformasjon.mobiltelefonnummer,
						kontaktinformasjon.epostadresse,
						<KompetansebevisSomObjektUtlopsvisning
							kompetansebevis={kompetansebevis}
							lastNedVedleggUrl={lastNedVedleggUrl}
							lastNedVedlegg={lastNedVedlegg}
						/>,
				  ];

		return {
			kolonner: kolonner,
			markerEndring:
				!!forrigeSoknad &&
				erAnsvarligPersonEndret(
					kolonner,
					lastNedVedleggUrl,
					lastNedVedlegg,
					forrigeSoknad.vegarbeid?.kontakter,
					aktortype
				),
		};
	});
	if (data.length === 0) {
		data = [
			{
				kolonner:
					aktortype === AKTORTYPE_STEDSANSVARLIG
						? ['', '']
						: ['', '', '', ''],
				markerEndring: false,
			},
		];
	}

	const harSlettetRader =
		!!forrigeSoknad &&
		getAlleAktorerEtterType(forrigeSoknad.vegarbeid?.kontakter, aktortype)
			?.length > personer.length;

	return (
		<OppsummeringPunkt tittel={tittel}>
			<OppsummeringTabell
				overskrifter={overskrifter}
				data={data}
				kolonner={4}
				className={'kontaktinformasjon'}
				skalMaskeres
			/>
			<SlettetInformasjonsboks
				vis={harSlettetRader}
				tekst={'Stedsansvarlig(e) har blitt slettet.'}
			/>
		</OppsummeringPunkt>
	);
}

function ByggherreOppsummering(props) {
	let { byggherre, forrigeSoknad } = props;
	byggherre = byggherre || {};
	const erByggherrePrivatperson = byggherre.type !== 'Enhet';
	const kontaktperson = erByggherrePrivatperson
		? byggherre
		: byggherre.kontaktperson || {};
	const kontaktinfo = kontaktperson.kontaktinformasjon || {};

	const bedriftprivat = ledetekst.getTekst(
		'arbeidsvarsling.soknad.Oppsummering.Kontaktinformasjon.byggherre.' +
			(erByggherrePrivatperson ? 'privat' : 'bedrift')
	);

	const overskrifter = [
		bedriftprivat,
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.byggherre.kontaktperson'
		),
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.mobiltelefon'
		),
		ledetekst.getTekst(
			'arbeidsvarsling.soknad.Kontaktinformasjon.aktor.epost'
		),
	];
	const kolonner = [
		erByggherrePrivatperson
			? bedriftprivat
			: byggherre.navn || bedriftprivat,
		kontaktperson.navn,
		kontaktinfo.mobiltelefonnummer,
		kontaktinfo.epostadresse,
	];

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

	return (
		<OppsummeringPunkt
			tittel={ledetekst.getTekst(
				'arbeidsvarsling.soknad.Kontaktinformasjon.byggherre.overskrift'
			)}
		>
			<OppsummeringTabell
				overskrifter={overskrifter}
				data={data}
				kolonner={overskrifter.length}
				className={'kontaktinformasjon'}
				skalMaskeres
			/>
		</OppsummeringPunkt>
	);
}

function erByggherreEndret(kolonner: any[], kontakter?: any[]): boolean {
	const byggherre = getEnAktorEtterType(kontakter, AKTORTYPE_BYGGHERRE) || {};
	const erByggherrePrivatperson = byggherre.type !== 'Enhet';
	const kontaktperson = erByggherrePrivatperson
		? byggherre
		: byggherre.kontaktperson || {};
	const kontaktinfo = kontaktperson.kontaktinformasjon || {};

	const bedriftprivat = ledetekst.getTekst(
		'arbeidsvarsling.soknad.Oppsummering.Kontaktinformasjon.byggherre.' +
			(erByggherrePrivatperson ? 'privat' : 'bedrift')
	);

	const kolonnerForrigeSoknad = [
		erByggherrePrivatperson
			? bedriftprivat
			: byggherre.navn || bedriftprivat,
		kontaktperson.navn,
		kontaktinfo.mobiltelefonnummer,
		kontaktinfo.epostadresse,
	];

	return !kolonnerForrigeSoknad.every(
		(value, indeks) => value === kolonner[indeks]
	);
}

function getEnAktorEtterType(kontakter, aktortype) {
	const aktorer = kontakter?.filter((aktor) => aktor.aktortype === aktortype);
	if (aktorer?.length > 0) {
		return aktorer[0];
	}
	return undefined;
}

const getAlleAktorerEtterType = (kontakter, aktortype) => {
	return kontakter?.filter((aktor) => aktor.aktortype === aktortype) || null;
};

export function skalHaEpostadresseAnsvarligVarsling(
	forsendelsesversjon: number
) {
	return (
		ANSVARLIG_VARSLING_EPOSTADRESSE_INTRODUSERT_VERSJON <=
		forsendelsesversjon
	);
}

export function getEpostadresseAnsvarligVarsling(aktor) {
	return (
		aktor &&
		aktor.kontaktperson &&
		aktor.kontaktperson.kontaktinformasjon &&
		aktor.kontaktperson.kontaktinformasjon.epostadresse
	);
}

export function KontaktinformasjonOppsummering() {
	const {
		kunLesbar,
		id: soknadId,
		soknad,
		forrigeSoknad,
		vegarbeid,
		gyldighet,
		lastNedVedleggUrl,
		lastNedVedlegg,
	} = useOppsummering();
	const kontaktinformasjon = vegarbeid.kontakter || [];

	const redigeringsLenke = !kunLesbar && `#/${soknadId}/kontaktinformasjon`;

	const valideringsfeil = !kunLesbar && validerKontaktinformasjon(soknad);

	return (
		<>
			<TilbakemeldingForSteg steg="kontaktinformasjon" />

			<OppsummeringBlokk
				tittel={ledetekst.getTekst(
					'arbeidsvarsling.soknad.Soknadskomponent.kulepunkter.Kontaktinformasjon'
				)}
				redigeringsLenke={redigeringsLenke}
				valideringsfeil={valideringsfeil}
				ikon={'ikon-person'}
			>
				<ByggherreOppsummering
					byggherre={getEnAktorEtterType(
						kontaktinformasjon,
						AKTORTYPE_BYGGHERRE
					)}
					forrigeSoknad={forrigeSoknad}
				/>

				<UtforerOppsummering
					utforer={getEnAktorEtterType(
						kontaktinformasjon,
						AKTORTYPE_UTFOERENDE_ENTREPRENOER
					)}
					utforerVarsling={getEnAktorEtterType(
						kontaktinformasjon,
						AKTORTYPE_UTFOERENDE_ENTREPRENOER_VARSLING
					)}
					forrigeSoknad={forrigeSoknad}
				/>

				<AnsvarligePersonerOppsummering
					personer={kontaktinformasjon.filter(
						(person) =>
							person.aktortype === AKTORTYPE_ANSVARSHAVENDE
					)}
					tittel={ledetekst.getTekst(
						'arbeidsvarsling.soknad.Kontaktinformasjon.ansvarshavende.overskrift'
					)}
					lastNedVedleggUrl={lastNedVedleggUrl}
					lastNedVedlegg={lastNedVedlegg}
					forrigeSoknad={forrigeSoknad}
					aktortype={AKTORTYPE_ANSVARSHAVENDE}
				/>

				<AnsvarligePersonerOppsummering
					personer={kontaktinformasjon.filter(
						(person) =>
							person.aktortype === AKTORTYPE_STEDSANSVARLIG
					)}
					tittel={ledetekst.getTekst(
						'arbeidsvarsling.soknad.Kontaktinformasjon.stedsansvarlig.overskrift'
					)}
					lastNedVedleggUrl={lastNedVedleggUrl}
					lastNedVedlegg={lastNedVedlegg}
					forrigeSoknad={forrigeSoknad}
					aktortype={AKTORTYPE_STEDSANSVARLIG}
				/>

				<BekreftelsePaKompetanseForStedsansvarlig
					kunLesbar={kunLesbar}
					erKompetanseBekreftet={vegarbeid.erKompetanseBekreftet}
				/>

				<GyldighetsRegistrerer
					gyldighet={gyldighet.obligatorisk()}
					erGyldig={!valideringsfeil}
				/>
			</OppsummeringBlokk>
		</>
	);
}
