import { Component, OnInit, ViewChild } from '@angular/core';
import { CupboardService } from '../../services/cupboard.service';
import { UsersService } from '../../services/users.service';
import { Need, GoalType } from '../../models/Need';
import { userType } from '../../models/User';
import { BehaviorSubject, catchError, of } from 'rxjs';

@Component({
  selector: 'app-cupboard',
  standalone: false,
  templateUrl: './cupboard.component.html',
  styleUrl: './cupboard.component.css'
})

export class CupboardComponent implements OnInit {

    protected statusText = new BehaviorSubject("")

needs: any;
    constructor(private cupboardService: CupboardService, private usersService: UsersService) { }

    ngOnInit(): void {
      this.cupboardService.getNeeds().subscribe(n => this.needs = n);
      this.close();
      this.openmenu();

      if (this.isManager()) {
        console.log("Admin view of Cupboard");
      } else {
        console.log("Limited helper view of Cupboard");
      }
    }

    selectedNeed: any = {
      name: '',
      id: null,
      maxGoal: null,
      type: ''
    };
    selectedNeedId: number | null = null;

    private hideElement(element: any) {
      if (element){
        element.style.visibility = 'hidden';
        element.style.position = 'absolute';
      }
    }

    private showElement(element: any) {
      if (element){
        element.style.visibility = 'visible';
        element.style.position = 'relative';
      }
    }

    openmenu() {
      const menuElement = document.getElementById('menu');
      this.showElement(menuElement);
    }

    opencreate() {
      this.close();
      this.showElement(document.getElementById('create-form'));
    }

    openupdate() {
      this.close();
      this.showElement(document.getElementById('update-form'));
    }

    back() {
      this.close();
      this.openmenu();
    }

    close() {
      this.hideElement(document.getElementById('create-form'));
      this.hideElement(document.getElementById('destroy-form'));
      this.hideElement(document.getElementById('menu'));
      this.hideElement(document.getElementById('update-form'));
    }

    populateForm(need: any): void {
      this.selectedNeed = { ...need };
    }

    isManager() {
      const type = this.usersService.getCurrentUser()?.type;
      return type === ("MANAGER" as unknown as userType);
    }

    update(form: any) {
      console.log(form);
      const need: Need = {
        name: form.name,
        id: form.id, //system will control this
        maxGoal: form.maxGoal,
        type: GoalType[form.type as keyof typeof GoalType],
        filterAttributes: [],
        current: 0
      };
      console.log("need:", need);
      console.log(need.id, need, "need updated");
      this.cupboardService.updateNeed(need.id, need).subscribe(
        (result) => {
          if (result) {
            console.log("need updated successfully");
            location.reload();
          } else {
            console.log("need update failed");
          }
        }

      );
    }

    submit(form: any) {
      const need: Need = {
        name: form.name,
        id: 0,
        maxGoal: form.maxGoal,
        type: form.type,
        filterAttributes: [],
        current: 0
      };
      console.log("need:", need);
      console.log("form submitted. creating need: ", need);
      this.cupboardService.createNeed(need)
      .pipe(catchError((ex, r) => {
              this.statusText.next("Max goal must be greater than 0 " + friendlyHttpStatus[ex.status])
              return of()
          }))
      .subscribe(
        (result) => {
          if (result) {
            console.log("need created successfully");
            location.reload();
          } else {
            console.log("need creation failed");
          }
        }

      );
    }

    destroy() {

    }
  }

let friendlyHttpStatus: {[key: number]: string} = {
    200: 'OK',
    201: 'Created',
    202: 'Accepted',
    203: 'Non-Authoritative Information',
    204: 'No Content',
    205: 'Reset Content',
    206: 'Partial Content',
    300: 'Multiple Choices',
    301: 'Moved Permanently',
    302: 'Found',
    303: 'See Other',
    304: 'Not Modified',
    305: 'Use Proxy',
    306: 'Unused',
    307: 'Temporary Redirect',
    400: 'Bad Request',
    401: 'Unauthorized',
    402: 'Payment Required',
    403: 'Forbidden',
    404: 'Not Found',
    405: 'Method Not Allowed',
    406: 'Not Acceptable',
    407: 'Proxy Authentication Required',
    408: 'Request Timeout',
    409: 'Conflict',
    410: 'Gone',
    411: 'Length Required',
    412: 'Precondition Required',
    413: 'Request Entry Too Large',
    414: 'Request-URI Too Long',
    415: 'Unsupported Media Type',
    416: 'Requested Range Not Satisfiable',
    417: 'Expectation Failed',
    418: 'I\'m a teapot',
    429: 'Too Many Requests',
    500: 'Internal Server Error',
    501: 'Not Implemented',
    502: 'Bad Gateway',
    503: 'Service Unavailable',
    504: 'Gateway Timeout',
    505: 'HTTP Version Not Supported',
};