import { Component, OnInit, ViewChild } from '@angular/core';
import { CupboardService } from '../../services/cupboard.service';
import { Need, GoalType } from '../../models/Need';
import { userType } from '../../models/User';
import { BehaviorSubject, catchError, of } from 'rxjs';
import { NeedListComponent } from '../need-list/need-list.component';
import {AuthService} from '../../services/auth.service';

@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;
    @ViewChild("needList") needList?: NeedListComponent

    constructor(
        private cupboardService: CupboardService,
        private authService: AuthService
    ) {}

    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.authService.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)
            .pipe(catchError((ex, _) => {
                if (ex.status == 500) {
                    this.statusText.next("Fields cannot be blank");
                } else if (ex.status == 400) {
                    this.statusText.next("Goal must be greater than 0");
                } else {
                    this.statusText.next("Error on creating need");
                }
                return of()
            }))
            .subscribe(
                (result) => {
                    if (result) {
                        console.log("need updated successfully");
                        this.needList?.refresh()
                    } 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, _) => {
                if (ex.status == 500) {
                    this.statusText.next("Fields cannot be blank");
                } else if (ex.status == 400) {
                    this.statusText.next("Goal must be greater than 0");
                } else {
                    this.statusText.next("Error on creating need");
                }
                return of()
            }))
            .subscribe(
                (result) => {
                    if (result) {
                        console.log("need created successfully");
                        this.needList?.refresh()
                    } else {
                        console.log("need creation failed");
                    }
                }

            );
    }

    destroy() {

    }
}