import { Injectable } from "@angular/core";
import { TranslateService } from "@ngx-translate/core";
import { BehaviorSubject, Observable } from "rxjs";
import { MESSAGEKEY } from "../utils/enums";
import { NotificationService } from "../shared/services/notification.service";

@Injectable(
    { providedIn: 'root' }
)
export class I18NService {

    public translationsMerge: BehaviorSubject<boolean> = new BehaviorSubject(<boolean>false);

    constructor(private translate: TranslateService, private notificationService: NotificationService) {


    }

    success(code: string, customMessage: any[], defaultText?: string): any {
        let params = this.keyValueParamter(customMessage);

        this.getMessageTranslate(MESSAGEKEY.SUCCESS, code, params).subscribe((res) => {
            this.notificationService.success((res[code] == code && defaultText != undefined) ? defaultText : res[code]);
        });      
    }

    error(code: string, customMessage: any[], defaultText?: string): any {
        let params = this.keyValueParamter(customMessage);
        this.getMessageTranslate(MESSAGEKEY.ERROR, code, params).subscribe((res) => {
            this.notificationService.error((res[code] == code && defaultText != undefined) ? defaultText : res[code]);          
        });
    }

    info(code: string, customMessage: any[]): any {
        let params = this.keyValueParamter(customMessage);
        this.getMessageTranslate(MESSAGEKEY.INFO, code, params).subscribe((res) => {
            this.notificationService.info(res[code]);
        }); 
    }

    warn(code: string, customMessage: any[]): any {
        let params = this.keyValueParamter(customMessage);
        this.getMessageTranslate(MESSAGEKEY.WARN, code, params).subscribe((res) => {
            this.notificationService.warning(res[code]);
        });
    }

    notification(code: string, customMessage: any[]): string {
        let params = this.keyValueParamter(customMessage);
        let notification: string = "";
        this.getMessageTranslate(MESSAGEKEY.NOTIFICATION, code, params).subscribe((res) => {
            notification = res[code] as string;
        });
        return notification;
    }


    keyValueParamter(params: object[]): Object {
        // Create an object to hold the key-value pairs
        const keyValueObject: { [key: string]: string } = {};
    
        // Populate the object
        for (let i = 0; i < params?.length; i++) {
            keyValueObject[`value${i + 1}`] = String(params[i]);
        }
    
        return keyValueObject;
    }

    getMessageTranslate(type: string, code: string, params: any): Observable<string | any> {
        if (type == MESSAGEKEY.SUCCESS) {
            return this.translate.get([code, "SUC_APP_F_SUM"], params)
        } else if (type == MESSAGEKEY.ERROR) {
            return this.translate.get([code, "ERR_APP_F_SUM"], params)
        } else if (type == MESSAGEKEY.WARN) {
            return this.translate.get([code, "WRN_APP_F_SUM"], params)
        } else if (type == MESSAGEKEY.INFO) {
            return this.translate.get([code, "INF_APP_F_SUM"], params)
        } else if (type == MESSAGEKEY.NOTIFICATION) {
            return this.translate.get([code, "NTF_APP_F_SUM"], params)
        } else {
            return this.translate.get([code, code], params)
        }
    }


}