
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { DatasetStatus } from '@app/core/common/enum/dataset-status';
import { DmpStatus } from '@app/core/common/enum/dmp-status';
import { Principal } from '@app/core/model/auth/principal';
import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview';
import { DatasetsToBeFinalized } from '@app/core/model/dataset/datasets-toBeFinalized';
import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview';
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
import { AuthService } from '@app/core/services/auth/auth.service';
import { DmpService } from '@app/core/services/dmp/dmp.service';
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
import { DmpFinalizeDialogComponent, DmpFinalizeDialogInput, DmpFinalizeDialogOutput } from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component';
import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item';
import { BaseComponent } from '@common/base/base.component';
import { TranslateService } from '@ngx-translate/core';
import * as FileSaver from 'file-saver';
import { Observable, of as observableOf } from 'rxjs';
import { takeUntil, map } from 'rxjs/operators';
import { Role } from "@app/core/common/enum/role";
import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component';
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service';
import { UserService } from '@app/core/services/user/user.service';
import { Location } from '@angular/common';
import { FormGroup } from '@angular/forms';
import { LockService } from '@app/core/services/lock/lock.service';
import { VersionListingModel } from '@app/core/model/version/version-listing.model';
import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component';
import { DmpModel } from '@app/core/model/dmp/dmp';
import { DmpEditorModel } from '../editor/dmp-editor.model';
import { FunderFormModel } from '../editor/grant-tab/funder-form-model';
import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model';
import { StartNewDmpDialogComponent } from '../start-new-dmp-dialogue/start-new-dmp-dialog.component';
import { HttpClient } from '@angular/common/http';
import { MatomoService } from '@app/core/services/matomo/matomo-service';
import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component';
import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service';
import { DmpDepositDialogComponent } from '../editor/dmp-deposit-dialog/dmp-deposit-dialog.component';
import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration';
import { DoiModel } from '@app/core/model/doi/doi';
import { MatSelect } from '@angular/material/select';

@Component({
	selector: 'app-dmp-overview',
	templateUrl: './dmp-overview.component.html',
	styleUrls: ['./dmp-overview.component.scss']
})
export class DmpOverviewComponent extends BaseComponent implements OnInit {

	dmp: DmpOverviewModel;
	dmpModel: DmpEditorModel;
	isNew = true;
	isFinalized = false;
	isPublicView = true;
	hasPublishButton: boolean = true;
	breadCrumbs: Observable<BreadcrumbItem[]> = observableOf();
	isUserOwner: boolean;
	expand = false;
	hasDOIToken = false;
	lockStatus: Boolean;
	textMessage: any;
	versions: VersionListingModel[];
	version: VersionListingModel;

	@ViewChild('doi')
	doi: ElementRef;

	depositRepos: DepositConfigurationModel[] = [];

	formGroup: FormGroup;

	constructor(
		private route: ActivatedRoute,
		private router: Router,
		private dmpService: DmpService,
		private depositRepositoriesService: DepositRepositoriesService,
		private translate: TranslateService,
		private authentication: AuthService,
		private dialog: MatDialog,
		private language: TranslateService,
		private uiNotificationService: UiNotificationService,
		private configurationService: ConfigurationService,
		private location: Location,
		private lockService: LockService,
		private matomoService: MatomoService
	) {
		super();
	}

	ngOnInit() {
		this.matomoService.trackPageView('DMP Overview');
		// Gets dmp data using parameter id
		this.route.params
			.pipe(takeUntil(this._destroyed))
			.subscribe((params: Params) => {
				const itemId = params['id'];
				const publicId = params['publicId'];
				if (itemId != null) {
					this.isNew = false;
					this.isPublicView = false;
					this.dmpService.getOverviewSingle(itemId)
						.pipe(takeUntil(this._destroyed))
						.subscribe(data => {
							this.dmp = data;
							this.checkLockStatus(this.dmp.id);
							this.setIsUserOwner();
							this.getAllVersions(this.dmp);
							const breadCrumbs = [];
							breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DMPS'), url: "/plans" });
							breadCrumbs.push({ parentComponentName: 'DmpListingComponent', label: this.dmp.label, url: '/plans/overview/' + this.dmp.id });
							this.breadCrumbs = observableOf(breadCrumbs);
						}, (error: any) => {
							if (error.status === 404) {
								return this.onFetchingDeletedCallbackError('/plans/');
							}
							if (error.status === 403) {
								return this.onFetchingForbiddenCallbackError('/plans/');
							}
						});
				}
				else if (publicId != null) {
					this.isNew = false;
					this.isFinalized = true;
					this.isPublicView = true;
					this.dmpService.getOverviewSinglePublic(publicId)
						.pipe(takeUntil(this._destroyed))
						.subscribe(data => {
							this.dmp = data;
							// this.checkLockStatus(this.dmp.id);
							this.getAllVersions(this.dmp);
							const breadCrumbs = [];
							breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.PUBLIC-DMPS'), url: "/explore-plans" });
							breadCrumbs.push({ parentComponentName: 'DmpListingComponent', label: this.dmp.label, url: '/plans/publicOverview/' + this.dmp.id });
							this.breadCrumbs = observableOf(breadCrumbs);
						}, (error: any) => {
							if (error.status === 404) {
								return this.onFetchingDeletedCallbackError('/explore-plans');
							}
							if (error.status === 403) {
								return this.onFetchingForbiddenCallbackError('/explore-plans');
							}
						});
				}
			});
		this.depositRepositoriesService.getAvailableRepos()
		.pipe(takeUntil(this._destroyed))
		.subscribe(
			repos => {
				this.depositRepos = repos;
		});
	}

	onFetchingDeletedCallbackError(redirectRoot: string) {
		this.uiNotificationService.snackBarNotification(this.language.instant('DMP-OVERVIEW.ERROR.DELETED-DMP'), SnackBarNotificationLevel.Error);
		this.router.navigate([redirectRoot]);
	}

	onFetchingForbiddenCallbackError(redirectRoot: string) {
		this.uiNotificationService.snackBarNotification(this.language.instant('DMP-OVERVIEW.ERROR.FORBIDEN-DMP'), SnackBarNotificationLevel.Error);
		this.router.navigate([redirectRoot]);
	}

	setIsUserOwner() {
		if (this.dmp) {
			const principal: Principal = this.authentication.current();
			if (principal) this.isUserOwner = !!this.dmp.users.find(x => (x.role === Role.Owner) && (principal.id === x.id));
		}
	}

	isUserAuthor(userId: string): boolean {
		if (this.isAuthenticated()) {
			const principal: Principal = this.authentication.current();
			return userId === principal.id;
		} else return false;
	}

	editClicked(dmp: DmpOverviewModel) {
		this.router.navigate(['/plans/edit/', dmp.id]);
		// let url = this.router.createUrlTree(['/plans/edit/', dmp.id]);
		// window.open(url.toString(), '_blank');
	}

	cloneOrNewVersionClicked(dmp: DmpOverviewModel, isNewVersion: boolean) {
		this.dmpService.getSingle(this.dmp.id).pipe(map(data => data as DmpModel))
			.pipe(takeUntil(this._destroyed))
			.subscribe(data => {
				this.dmpModel = new DmpEditorModel();
				this.dmpModel.grant = new GrantTabModel();
				this.dmpModel.project = new ProjectFormModel();
				this.dmpModel.funder = new FunderFormModel();
				this.dmpModel.extraProperties = new ExtraPropertiesFormModel();
				this.dmpModel.fromModel(data);
				this.dmpModel.status = DmpStatus.Draft;
				this.formGroup = this.dmpModel.buildForm();
				if (!isNewVersion) {
					this.formGroup.get('label').setValue(this.dmp.label + " New");
				}
				this.openCloneDialog(isNewVersion);
			});
	}

	openCloneDialog(isNewVersion: boolean) {
		const dialogRef = this.dialog.open(CloneDialogComponent, {
			maxWidth: '900px',
			maxHeight: '80vh',
			data: {
				formGroup: this.formGroup,
				datasets: this.dmp.datasets,
				isNewVersion: isNewVersion,
				confirmButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.SAVE'),
				cancelButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.CANCEL'),
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
			if (result) {
				if (!isNewVersion) {
					this.dmpService.clone(this.formGroup.getRawValue(), this.dmp.id)
						.pipe(takeUntil(this._destroyed))
						.subscribe(
							complete => this.onCallbackSuccess(complete),
							error => this.onCallbackError(error)
						);
				} else if (isNewVersion) {
					this.dmpService.newVersion(this.formGroup.getRawValue(), this.dmp.id)
						.pipe(takeUntil(this._destroyed))
						.subscribe(
							complete => this.onCallbackSuccess(complete),
							error => this.onCallbackError(error)
						);
				}
			}
		});
	}

	onCallbackSuccess(dmpId: String): void {
		this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
		this.router.navigate(['/plans/edit/', dmpId]);
	}

	onCallbackError(error: any) {
		this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Error);
	}

	grantClicked(grantId: String) {
		// ----------- UNCOMMENT TO ADD AGAIN GRANTS --------
		// this.router.navigate(['/grants/edit/' + grantId]);
	}

	expandDesc() {
		this.expand = !this.expand;
	}

	checkOverflow(element) {
		if (this.expand || (element.offsetHeight < element.scrollHeight ||
			element.offsetWidth < element.scrollWidth)) {
			return true;
		} else {
			return false;
		}
	}

	datasetClicked(datasetId: String) {
		// if (this.isPublicView) {
		// 	this.router.navigate(['/datasets/publicEdit/' + datasetId]);
		// } else {
		// 	this.router.navigate(['/datasets/edit/' + datasetId]);
		// }
		this.router.navigate(['/datasets/overview/' + datasetId]);
	}

	datasetsClicked(dmpId: String) {
		if (!this.isFinalized)
			this.router.navigate(['/plans/edit/' + dmpId], { queryParams: { tab: "datasetDescriptions" } });
		else
			this.router.navigate(['/explore'], { queryParams: { dmpId: dmpId } });
	}

	goToUri(uri: string) {
		window.open(uri, "_blank");
	}

	deleteClicked() {
		const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
			maxWidth: '300px',
			data: {
				message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'),
				confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'),
				cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
				isDeleteConfirmation: true
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
			if (result) {
				this.dmpService.delete(this.dmp.id)
					.pipe(takeUntil(this._destroyed))
					.subscribe(
						complete => { this.onDeleteCallbackSuccess() },
						error => this.onDeleteCallbackError(error)
					);
			}
		});
	}

	onDeleteCallbackSuccess(): void {
		this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
		this.router.navigate(['/plans']);
	}

	onDeleteCallbackError(error) {
		this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
	}

	onUpdateCallbackSuccess(): void {
		this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
		this.reloadPage();
	}

	onUpdateCallbackError(error) {
		this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error);
	}

	downloadXml(id: string) {
		this.dmpService.downloadXML(id)
			.pipe(takeUntil(this._destroyed))
			.subscribe(response => {
				const blob = new Blob([response.body], { type: 'application/xml' });
				const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));

				FileSaver.saveAs(blob, filename);
			});
	}

	downloadDocx(id: string) {
		this.dmpService.downloadDocx(id)
			.pipe(takeUntil(this._destroyed))
			.subscribe(response => {
				const blob = new Blob([response.body], { type: 'application/msword' });
				const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));

				FileSaver.saveAs(blob, filename);
			});
	}

	downloadPDF(id: string) {
		this.dmpService.downloadPDF(id)
			.pipe(takeUntil(this._destroyed))
			.subscribe(response => {
				const blob = new Blob([response.body], { type: 'application/pdf' });
				const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));

				FileSaver.saveAs(blob, filename);
			});
	}

	downloadJson(id: string) {
		this.dmpService.downloadJson(id)
			.pipe(takeUntil(this._destroyed))
			.subscribe(complete => {
				const blob = new Blob([complete.body], { type: 'application/json' });
				const filename = this.getFilenameFromContentDispositionHeader(complete.headers.get('Content-Disposition'));
				FileSaver.saveAs(blob, filename);
			}, async error => {
				this.onExportCallbackError(error);
			});
	}

	async onExportCallbackError(error: any) {
		const errorJsonText = await error.error.text();
		const errorObj = JSON.parse(errorJsonText);
		this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error);
	}

	getFilenameFromContentDispositionHeader(header: string): string {
		const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g);

		const matches = header.match(regex);
		let filename: string;
		for (let i = 0; i < matches.length; i++) {
			const match = matches[i];
			if (match.includes('filename="')) {
				filename = match.substring(10, match.length - 1);
				break;
			} else if (match.includes('filename=')) {
				filename = match.substring(9);
				break;
			}
		}
		return filename;
	}

	roleDisplayFromList(value: UserInfoListingModel[]) {
		const principal: Principal = this.authentication.current();
		let role: number;
		if (principal) {
			value.forEach(element => {
				if (principal.id === element.id) {
					role = element.role;
				}
			});
		}
		if (role === Role.Owner) {
			return this.translate.instant('DMP-LISTING.OWNER');
		} else if (role === Role.Member) {
			return this.translate.instant('DMP-LISTING.MEMBER');
		} else {
			return this.translate.instant('DMP-LISTING.OWNER');
		}
	}

	isUserDMPRelated() {
		const principal: Principal = this.authentication.current();
		let isRelated: boolean = false;
		if (this.dmp && principal) {
			this.dmp.users.forEach(element => {
				if (element.id === principal.id) {
					isRelated = true;
				}
			})
		}
		return isRelated;
	}

	roleDisplay(value: UserInfoListingModel) {
		if (value.role === Role.Owner) {
			return this.translate.instant('DMP-LISTING.OWNER');
		} else if (value.role === Role.Member) {
			return this.translate.instant('DMP-LISTING.MEMBER');
		} else {
			return this.translate.instant('DMP-LISTING.OWNER');
		}
	}

	isDraftDataset(dataset: DatasetOverviewModel) {
		return dataset.status == DatasetStatus.Draft;
	}

	isDraftDmp(dmp: DmpOverviewModel) {
		return dmp.status == DmpStatus.Draft;
	}

	isFinalizedDmp(dmp: DmpOverviewModel) {
		return dmp.status == DmpStatus.Finalized;
	}

	isPublishedDMP(dmp: DmpOverviewModel) {
		return (dmp.status == DmpStatus.Finalized && dmp.isPublic);
	}

	hasDoi(dmp: DmpOverviewModel) {
		return (this.dmp.dois == null || this.dmp.dois.length == 0) ? true : false;
	}

	getAllVersions(dmp: DmpOverviewModel) {
		this.dmpService.getAllVersions(dmp.groupId, this.isPublicView)
			.pipe(takeUntil(this._destroyed))
			.subscribe(items => {
				this.versions = items;
			});
	}

	showPublishButton(dmp: DmpOverviewModel) {
		return this.isFinalizedDmp(dmp) && !dmp.isPublic && this.hasPublishButton;
	}

	publish(dmpId: String) {
		const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
			maxWidth: '500px',
			restoreFocus: false,
			data: {
				message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PUBLISH-ITEM'),
				privacyPolicyNames: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PRIVACY-POLICY-NAMES'),
				confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'),
				cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
				isDeleteConfirmation: false
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
			if (result) {
				this.dmpService.publish(dmpId)
					.pipe(takeUntil(this._destroyed))
					.subscribe(() => {
						this.hasPublishButton = false;
						this.reloadPage();
					});
			}
		});
	}

	deposit(){
		const dialogRef = this.dialog.open(DmpDepositDialogComponent, {
			maxWidth: '600px',
			disableClose: true,
			restoreFocus: false,
			autoFocus: false,
			data: {
				depositRepos: [this.depositRepos, this.dmp],
				message: this.language.instant('DMP-OVERVIEW.DEPOSIT.SELECT-REPOSITORIES'),
				confirmButton: this.language.instant('DMP-OVERVIEW.DEPOSIT.AUTHORIZE'),
				cancelButton: this.language.instant('DMP-OVERVIEW.DEPOSIT.CANCEL'),
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: DoiModel[]) => {
			if (result.length > 0) {
				this.dmp.dois.push(...result);
				this.hasDOIToken = true;
			}
		});
	}

	moreDeposit(){
		return (this.dmp.dois.length < this.depositRepos.length) ? true : false;
	}

	finalize(dmp: DmpOverviewModel) {

		const dialogInputModel: DmpFinalizeDialogInput = {
			dmpLabel: this.dmp.label,
			dmpDescription: this.dmp.description,
			datasets: this.dmp.datasets.map(x => {
				return { label: x.label, id: x.id, status: x.status }
			})
		}

		const dialogRef = this.dialog.open(DmpFinalizeDialogComponent, {
			maxWidth: '500px',
			restoreFocus: false,
			autoFocus: false,
			data: {
				dialogInputModel: dialogInputModel,
				message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'),
				confirmButton: this.language.instant('DMP-FINALISE-DIALOG.SUBMIT'),
				cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: DmpFinalizeDialogOutput) => {
			if (result && !result.cancelled) {
				var datasetsToBeFinalized: DatasetsToBeFinalized = {
					uuids: result.datasetsToBeFinalized
				};
				this.dmpService.finalize(datasetsToBeFinalized, this.dmp.id)
					.pipe(takeUntil(this._destroyed))
					.subscribe(
						complete => {
							this.dmp.status = DmpStatus.Finalized;
							this.onUpdateCallbackSuccess();
						},
						error => this.onUpdateCallbackError(error)
					);
			}
		});
	}

	// newVersion(id: String, label: String) {
	// 	let url = this.router.createUrlTree(['/plans/new_version/', id, { dmpLabel: label }])
	// 	window.open(url.toString(), '_blank')
	// }

	viewVersions(rowId: String, rowLabel: String) {
		if (this.isPublicView) {
			this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
		} else {
			this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
		}
	}

	public isAuthenticated(): boolean {
		return !(!this.authentication.current());
	}

	versionChanged(versionId: string): void {
		if (this.isPublicView) {
			this.router.navigate(['/explore-plans/publicOverview/' + versionId]);
		} else {
			this.router.navigate(['/plans/overview/' + versionId]);
		}
	}

	openShareDialog(rowId: any, rowName: any) {
		const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
			// height: '250px',
			// width: '700px',
			autoFocus: false,
			restoreFocus: false,
			data: {
				dmpId: rowId,
				dmpName: rowName
			}
		});
	}

	openNewDmpDialog() {
		if (this.dialog.openDialogs.length > 0) {
			this.dialog.closeAll();
		}
		else {
			const dialogRef = this.dialog.open(StartNewDmpDialogComponent, {
				disableClose: false,
				data: {
					isDialog: true
				}
			});
		}
	}

	// addDataset(rowId: String) {
	// 	this.router.navigate(['/datasets/new/' + rowId]);
	// }

	addNewDataset() {
		this.router.navigate(['/datasets', 'new', this.dmp.id]);
	}

	selectDoi(s: MatSelect, doiModel: DoiModel){
		s.placeholder = doiModel.doi;
		const foundIdx = this.dmp.dois.findIndex(el => el == doiModel);
		this.dmp.dois.splice(foundIdx, 1);
		this.dmp.dois.unshift(doiModel);
	}

	createDoiLink(doiModel: DoiModel): string {
		if(doiModel.repositoryId == "Zenodo"){
			const doiarr = doiModel.doi.split('.');
			const id = doiarr[doiarr.length - 1];
			return this.depositRepos.find(r => r.repositoryId == doiModel.repositoryId).repositoryRecordUrl + id;
		}
		else{
			return this.depositRepos.find(r => r.repositoryId == doiModel.repositoryId).repositoryRecordUrl + doiModel.doi;
		}
	}

	reverse() {
		const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
			restoreFocus: false,
			data: {
				message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.UNFINALIZE-ITEM'),
				confirmButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.AFFIRMATIVE'),
				cancelButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.NEGATIVE'),
				isDeleteConfirmation: false
			}
		});
		dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
			if (result) {
				this.dmpService.unfinalize(this.dmp.id).pipe(takeUntil(this._destroyed))
					.subscribe(
						complete => {
							this.dmp.status = DmpStatus.Draft;
							this.onUpdateCallbackSuccess()
						},
						error => this.onUpdateCallbackError(error)
					);
			}
		});
	}

	goBack(): void {
		this.location.back();
	}

	reloadPage(): void {
		const path = this.location.path();
		this.router.navigateByUrl('/reload', { skipLocationChange: true }).then(() => {
			this.router.navigate([path]);
		});
	}

	updateUsers() {
		return this.dmpService.updateUsers(this.dmp.id, this.dmp.users).pipe(takeUntil(this._destroyed))
			.subscribe(
				complete => {
					this.onUpdateCallbackSuccess();
				},
				error => this.onUpdateCallbackError(error)
			);
	}

	removeUserFromDmp(user: UserInfoListingModel) {
		const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
			data: {
				message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-USER'),
				confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.REMOVE'),
				cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
				isDeleteConfirmation: false
			}
		});
		dialogRef.afterClosed().subscribe(result => {
			if (result) {
				const list = this.dmp.users;
				const index = this.dmp.users.indexOf(user);
				if (index > -1) {
					this.dmp.users.splice(index, 1);
				}
				this.updateUsers();
			}
		});
	}

	copyDoi(doi) {
		const el = document.createElement('textarea');
		el.value = doi;
		el.setAttribute('readonly', '');
		el.style.position = 'absolute';
		el.style.left = '-9999px';
		document.body.appendChild(el);
		el.select();
		document.execCommand('copy');
		document.body.removeChild(el);
		this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-COPY-TO-CLIPBOARD'), SnackBarNotificationLevel.Success);
	}

	public getOrcidPath(): string {
		return this.configurationService.orcidPath;
	}

	isOrcid(reference: string) {
		const head = reference.split(':')[0];
		return head === 'orcid';
	}

	getOrcidPathForResearcher(reference: string): string {
		const path = this.getOrcidPath();
		const userId = reference.split(':')[1];
		return path + userId;
	}

	checkLockStatus(id: string) {
		this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
			.subscribe(lockStatus => {
				this.lockStatus = lockStatus
				if(lockStatus){
					this.dialog.open(PopupNotificationDialogComponent,{data:{
						title:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.TITLE'),
						message:this.language.instant('DMP-OVERVIEW.LOCKED-DIALOG.MESSAGE')
					}, maxWidth:'30em'});
				}
			});
	}

	getUserFromDMP(): any {
		if (this.dmp) {
			const principal: Principal = this.authentication.current();
			return this.dmp.users.find(x => x.id === principal.id);
		}
	}




	// advancedClicked() {
	// 	const dialogRef = this.dialog.open(ExportMethodDialogComponent, {
	// 		maxWidth: '500px',
	// 		data: {
	// 			message: "Download as:",
	// 			XMLButton: "XML",
	// 			documentButton: "Document",
	// 			pdfButton: "PDF",
	// 			jsonButton: "JSON"
	// 		}
	// 	});
	// 	dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
	// 		if (result == "pdf") {
	// 			this.downloadPDF(this.dmp.id);
	// 		} else if (result == "xml") {
	// 			this.downloadXml(this.dmp.id);
	// 		} else if (result == "doc") {
	// 			this.downloadDocx(this.dmp.id);
	// 		} else if (result == "json") {
	// 			this.downloadJson(this.dmp.id);
	// 		}
	// 	});
	// }

	// advancedClickedFinalized() {
	// 	const dialogRef = this.dialog.open(ExportMethodDialogComponent, {
	// 		maxWidth: '250px',
	// 		data: {
	// 			message: "Download as:",
	// 			documentButton: "Document",
	// 			pdfButton: "PDF",
	// 			isFinalized: true
	// 		}
	// 	});
	// 	dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
	// 		if (result == "pdf") {
	// 			this.downloadPDF(this.dmp.id);
	// 		} else if (result == "doc") {
	// 			this.downloadDocx(this.dmp.id);
	// 		}
	// 	});
	// }

	// getAccessUrl(): string {
	// 	const redirectUri = this.configurationService.app + 'oauth2';
	// 	const url = this.configurationService.loginProviders.zenodoConfiguration.oauthUrl
	// 		+ '?client_id=' + this.configurationService.loginProviders.zenodoConfiguration.clientId
	// 		+ '&response_type=code&scope=deposit:write+deposit:actions+user:email&state=astate&redirect_uri='
	// 		+ redirectUri;
	// 	return url;
	// }

	// getDoi(dmp: DmpOverviewModel) {
	// 	this.userService.hasDOIToken().subscribe(response => {
	// 		this.hasDOIToken = true;
	// 		this.showConfirmationDOIDialog(dmp);
	// 	}, error => {
	// 		this.hasDOIToken = false;
	// 		this.showErrorConfirmationDOIDialog(error.error.message, dmp);
	// 	});
	// }

	// showConfirmationDOIDialog(dmp: DmpOverviewModel) {
	// 	const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
	// 		maxWidth: '600px',
	// 		restoreFocus: false,
	// 		data: {
	// 			message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ZENODO-DOI', { 'username': this.hasDOIToken ? this.authentication.current().zenodoEmail : 'default' }),
	// 			confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'),
	// 			cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
	// 		}
	// 	});
	// 	dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
	// 		if (result) {
	// 			this.dmpService.getDoi(dmp.id)
	// 				.pipe(takeUntil(this._destroyed))
	// 				.subscribe(
	// 					complete => {
	// 						this.onDOICallbackSuccess();
	// 						this.dmp.doi = complete;
	// 					},
	// 					error => this.onDeleteCallbackError(error)
	// 				);
	// 		}
	// 	});
	// }

	// showErrorConfirmationDOIDialog(message: string, dmp: DmpOverviewModel) {
	// 	const dialogRef = this.dialog.open(MultipleChoiceDialogComponent, {
	// 		maxWidth: '600px',
	// 		restoreFocus: false,
	// 		data: {
	// 			message: message ? this.language.instant(message) : this.language.instant('GENERAL.ERRORS.HTTP-REQUEST-ERROR'),
	// 			titles: [this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.ZENODO-LOGIN'), this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.USE-DEFAULT')]
	// 		}
	// 	});
	// 	dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
	// 		switch (result) {
	// 			case 0:
	// 				// this.authentication.logout();
	// 				// this.router.navigate(['/login/external/zenodo']);
	// 				this.showOauth2Dialog(this.getAccessUrl(), dmp);
	// 				break;
	// 			case 1:
	// 				this.showConfirmationDOIDialog(dmp);
	// 				break;
	// 		}
	// 	});
	// }

	// showOauth2Dialog(url: string, dmp: DmpOverviewModel) {
	// 	this.oauth2DialogService.login(url)
	// 		.pipe(takeUntil(this._destroyed))
	// 		.subscribe(result => {
	// 			if (result !== undefined) {
	// 				if (result.oauthCode !== undefined && result.oauthCode !== null && !this.oauthLock) {
	// 					this.userService.registerDOIToken(result.oauthCode, this.configurationService.app + 'oauth2')
	// 						.pipe(takeUntil(this._destroyed))
	// 						.subscribe(() => {
	// 							this.hasDOIToken = true;
	// 							this.showConfirmationDOIDialog(dmp);
	// 						});
	// 					this.oauthLock = true;
	// 				}
	// 			} else {
	// 				this.oauthLock = false;
	// 			}
	// 		});
	// }

	// onDOICallbackSuccess(): void {
	// 	this.uiNotificationService.snackBarNotification(this.language.instant('DMP-EDITOR.SNACK-BAR.SUCCESSFUL-DOI'), SnackBarNotificationLevel.Success);
	// }

	// onDOICallbackError(error) {
	// 	this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DMP-EDITOR.SNACK-BAR.UNSUCCESSFUL-DOI'), SnackBarNotificationLevel.Error);
	// }

}
