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';
import { NeedListComponent } from '../need-list/need-list.component';

@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 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('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)
            .pipe(catchError((ex, r) => {
                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, r) => {
                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() {

    }
}

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',
    422: 'Unprocessable Entity',
    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',
};