import { Component, OnInit } from "@angular/core";
import { Router, ActivatedRoute } from "@angular/router";
import { FormBuilder, FormGroup, Validators } from "@angular/forms";

import { first } from "rxjs/operators";

import { AuthenticationService } from "../../services/authentication.service";
import { User } from "../../models/user";

@Component({
  selector: "app-create-user",
  templateUrl: "./create-user.component.html",
  styleUrls: ["./create-user.component.css"]
})
export class CreateUserComponent implements OnInit {
  createForm: FormGroup;
  invalidForm = true;
  submitted = false;
  returnUrl: string;
  error = "";

  constructor(
    private formBuilder: FormBuilder,
    private route: ActivatedRoute,
    private router: Router,
    private authenticationService: AuthenticationService
  ) {
    // redirect to home if already logged in
    if (this.authenticationService.currentUserValue) {
      this.router.navigate(["/"]);
    }
  }

  ngOnInit() {
    this.createForm = this.formBuilder.group(
      {
        username: ["", [Validators.required, Validators.minLength(3)]],
        password: [
          "",
          [Validators.required, Validators.pattern("^[A-Za-z0-9_-|/]{8,15}$")]
        ],
        firstname: ["", [Validators.required, Validators.minLength(3)]],
        lastname: ["", [Validators.required, Validators.minLength(3)]],
        email: ["", [Validators.required, Validators.email]]
      },
      { updateOn: "blur" }
    );

    // get return url from route parameters or default to '/'
    this.returnUrl = this.route.snapshot.queryParams["returnUrl"] || "/";
  }

  get formCtrls() {
    return this.createForm.controls;
  }

  onCreateSubmit() {
    this.invalidForm = false;
    this.submitted = true;

    if (this.createForm.invalid) {
      this.invalidForm = true;
      return;
    }

    let createUser = new User();
    createUser.login = this.formCtrls.username.value;
    createUser.password = this.formCtrls.password.value;
    createUser.firstName = this.formCtrls.firstname.value;
    createUser.lastName = this.formCtrls.lastname.value;
    createUser.email = this.formCtrls.email.value;

    this.authenticationService.create(createUser)
                              .pipe(first())
                              .subscribe(
                                data => {
                                  this.router.navigate([this.returnUrl]);
                                },
                                error => {
                                  this.error = error;
                                  this.invalidForm = false;
                                }
                              );
  }
}
