import PropTypes from 'prop-types';
import React, { Component } from 'react';
import classnames from 'classnames';
import { Formatering } from '../pynt/Formatering';
import { Gyldighet } from './Gyldighet';
import { guid } from '../diverse/guid';
import { ledetekst } from '../diverse/Ledetekst';

// Hvorvidt "Obligatorisk" skal vises, betinget visning som standard
export const Obligatoriskvisning = Object.freeze({
	BETINGET: 1,
	UANSETT: 2,
	UANSETT_IKKE: 3,
});

class Felt extends Component {
	constructor(props) {
		super(props);
		this.id = 'felt' + guid();
		this._gyldighet = this.props.gyldighet;
	}
	componentWillUnmount() {
		if (this._gyldighet) {
			this._gyldighet.slett(this);
		}
	}
	_registrer(verdi) {
		if (this._gyldighet) {
			this._gyldighet.sett(this, verdi);
		}
	}
	_sjekk(ignorerSendt) {
		if (this._gyldighet) {
			return this._gyldighet.sjekkFelt(
				this,
				ignorerSendt || (this.state || { ufokusert: false }).ufokusert
			);
		} else {
			return [];
		}
	}
	_vedDimming() {
		this.setState({
			ufokusert: true,
		});
	}
	_renderIrettesettelse() {
		var sjekk = this._sjekk();
		if (!Array.isArray(sjekk) || sjekk.length === 0) {
			return null;
		}
		if (this.props.irettesettelse) {
			sjekk = [this.props.irettesettelse];
		}
		const klasser = classnames('label-valideringsfeil', {
			'er-skjult': sjekk.length === 0,
		});

		return (
			<div className={klasser} id={this.id + 'info'}>
				{sjekk.map((punkt, i) => {
					if (typeof punkt === 'string') {
						return <Formatering key={i} tekst={punkt} />;
					} else {
						return punkt;
					}
				})}
			</div>
		);
	}
	_renderObligatorisk(betingetVisning) {
		if (
			this.props.obligatoriskvisning !== Obligatoriskvisning.UANSETT &&
			(this.props.obligatoriskvisning ===
				Obligatoriskvisning.UANSETT_IKKE ||
				!this._obligatorisk ||
				!betingetVisning)
		) {
			return null;
		}
		return (
			<span className="label-tilleggsinfo">
				{ledetekst.getTekst(
					'arbeidsvarsling.frontendkomponenter.Felt.obligatorisk'
				)}
			</span>
		);
	}
}

Felt.propTypes = {
	gyldighet: PropTypes.instanceOf(Gyldighet),
	irettesettelse: PropTypes.oneOfType([
		PropTypes.string,
		PropTypes.node,
		PropTypes.func,
	]),
	obligatoriskvisning: PropTypes.instanceOf(Obligatoriskvisning),
};

export { Felt };
