/* Copyright CloudLinux Zug GmbH 2010-2017 All Rights Reserved
 *
 * Licensed under CLOUD LINUX LICENSE AGREEMENT
 * http://cloudlinux.com/docs/LICENSE.TXT
 */

import { Component, ElementRef, Input, ViewChild, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { InputAccessor } from '../input-accessor';
import { Helper } from '../../helper';
import { TypeOfTextInput } from '../../types';


@Component({
    selector: 'ui-text',
    template: require('./ui-text.html'),
    styles: [
        require('styles/common.less'),
        require('./ui-text.less')
    ],
    host: {
        'data-toggle': 'tooltip',
        'data-trigger': 'manual',
        'data-placement': 'bottom'
    },
    providers: [
        {provide: NG_VALUE_ACCESSOR, useExisting: UiText, multi: true}
    ],
})


export class UiText extends InputAccessor {

    paddingLeft: string;

    @HostBinding('class.with_error') error: boolean = false;
    @HostBinding('attr.data-original-title') originalTitle: string = '';

    @Input() format: TypeOfTextInput = 'number';
    @Input() icon: string = '';
    @Input() placeholder: string = '';

    @Input() set prefix(value: string) {
        this._prefix = value;
        this.updatePadding();
    }

    @ViewChild('prefixLabel') set prefixLabel(content: ElementRef) {
        this._prefixLabel = content;
        this.updatePadding();
    }

    get prefixLabel(): ElementRef {
        return this._prefixLabel;
    }

    get prefix(): string {
        return this._prefix;
    }

    private _prefix: string;
    private _prefixLabel: ElementRef;

    updatePadding() {
        if (this.prefixLabel && this._prefix) {
            this.paddingLeft = `${this.prefixLabel.nativeElement.offsetWidth}px`;
        }
    }

    constructor(public elementRef: ElementRef) {
        super();
    }

    public prepareValueHook() {
        if (this.format === 'number' && Helper.isNumber(this._innerValue)) {
            this._innerValue = Number(this._innerValue);
        }
        this.error = this.validator && this.validator.error;
        if (this.error) {
            this.originalTitle = this.validator.errorMessagesAsString;
        } else {
            this.originalTitle = '';
        }

    }

}
