import React, { useEffect, useState } from 'react';
import { Avgiver } from 'svv-hradm-dinside-brukerhandtering';
import {
	Feil,
	Feilboks,
	Formatering,
	Knapp,
	ledetekst,
	Ramme,
	Spinner,
} from '..';

const byttBrukerUrl = '/dinside/oversikt/avgiver/arbeidsvarsling';

function getMiljo() {
	const miljo: Miljo = (function () {
		let windowEnv = (window as any).ENV as string;
		if (windowEnv === undefined) {
			windowEnv = 'prod';
		}

		switch (windowEnv) {
			case 'prod':
			case 'test':
			case 'utv':
			case 'dev':
				return windowEnv;
			default:
				throw Error('Ikke godkjent kjøremiljø: ' + windowEnv);
		}
	})();
	return miljo;
}

interface Tilgang {
	harTilgang: boolean;
	erPrivatperson?: boolean;
	feil?: string | unknown;
}

async function harTilgang(soknadUrl, loggklient): Promise<Tilgang> {
	const tilgangsUrl = soknadUrl + 'soknad/tilgang';
	try {
		const avgiver = await Avgiver.hent();
		if (avgiver.type !== 'enhet') {
			if (loggklient && loggklient._logg) {
				loggklient.info(
					'Bruker har ikke tilgang til apv-arbeidsvarsling som privatperson, og blir bedt om å bytte bruker.'
				);
			}
			return {
				harTilgang: false,
				erPrivatperson: true,
			};
		}
		const orgnr = avgiver.id;
		const svar = await fetch(`${tilgangsUrl}/${orgnr}`, {
			credentials: 'include',
		});

		const tilgang = await svar.json();

		// vi sjekker om svaret er 1. 200-range, og 2. returnerer en json-enkodet boolean.
		// hvis ikke er det et problem med kallet til tilgangssjekken
		if (!svar.ok || typeof tilgang !== typeof true) {
			return {
				harTilgang: false,
				feil: `Fikk ikke kontakt med tilgangsendepunktet (${tilgangsUrl}): ${svar.status} - ${svar.statusText}`,
			};
		}

		return {
			harTilgang: tilgang,
			erPrivatperson: false,
		};
	} catch (e) {
		return {
			harTilgang: false,
			feil: e,
		};
	}
}

function useTilgang(soknadUrl, loggklient) {
	const [tilgang, setTilgang] = useState<Tilgang>({
		harTilgang: false,
		erPrivatperson: false,
	});
	const [laster, setLaster] = useState(true);

	useEffect(() => {
		setLaster(true);
		harTilgang(soknadUrl, loggklient).then((svar) => {
			setLaster(false);
			setTilgang(svar);
		});
	}, [soknadUrl]);

	return { tilgang, laster };
}

type Miljo = 'dev' | 'utv' | 'test' | 'prod';

function AltinnRolleSjekk(props) {
	const { children, tittel, soknadUrl, vedFeil, loggklient, featureToggles } =
		props;
	const isEnabled = featureToggles?.();
	const miljo = getMiljo();

	const { tilgang, laster } = useTilgang(soknadUrl, loggklient);

	useEffect(() => {
		if (!laster && tilgang.feil && vedFeil) {
			const feil = new Feil('Feil under sjekking av tilganger').med(
				'feilmelding',
				tilgang.feil
			);
			vedFeil(feil);
		}
	}, [laster, tilgang.feil, vedFeil]);

	useEffect(() => {
		if (!tilgang.harTilgang && !laster && tilgang.erPrivatperson) {
			window.location.href = getAktiveringLoginUrl(miljo);
		}
	}, [isEnabled, tilgang, laster]);

	if (laster) {
		return (
			<Ramme avstand>
				<Spinner
					aktivert={laster}
					tekst={ledetekst.getTekst(
						'arbeidsvarsling.frontendkomponenter.avgiverkontroll.laster'
					)}
				/>
			</Ramme>
		);
	}

	if (tilgang.harTilgang) {
		return children;
	}

	return (
		<div className="er-innlogget">
			<Ramme avstand>
				<h1 className="sidetittel">
					{tittel ||
						ledetekst.getTekst(
							'arbeidsvarsling.frontendkomponenter.avgiverkontroll.tittel'
						)}
				</h1>
			</Ramme>
			<Ramme avstand grafarge>
				<Feilboks>
					<Formatering
						tekst={
							tilgang.erPrivatperson
								? ledetekst.getTekst(
										'arbeidsvarsling.frontendkomponenter.avgiverkontroll.feilmelding.privatperson'
								  )
								: ledetekst.getTekst(
										'arbeidsvarsling.frontendkomponenter.avgiverkontroll.feilmelding.bedrift'
								  )
						}
					/>
				</Feilboks>

				<div className="vertical-spacing-medium">
					<Formatering
						tekst={ledetekst.getTekst(
							'arbeidsvarsling.frontendkomponenter.avgiverkontroll.infotekst'
						)}
					/>
					<Knapp
						klasse="vertical-spacing-small knapp-handling"
						vedKlikk={() => (window.location.href = byttBrukerUrl)}
					>
						{ledetekst.getTekst(
							'arbeidsvarsling.frontendkomponenter.avgiverkontroll.byttbruker'
						)}
					</Knapp>
				</div>
			</Ramme>
		</div>
	);
}

function getAktiveringLoginUrl(miljo: Miljo): string {
	switch (miljo) {
		case 'dev':
			return 'http://localhost:4000/#/login';
		case 'utv':
			return 'https://www.utv.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login';
		case 'test':
			return 'https://www.test.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login';
		case 'prod':
			return 'https://www.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login';
		default:
			return 'https://www.vegvesen.no/dinside/veg/arbeidsvarsling/aktiver/#/login';
	}
}

export { AltinnRolleSjekk };
