import {Utils} from "../Utils";
import {RegexTag} from "./RegexTag";
import {TagsFilter} from "./TagsFilter";
import {TagUtils} from "./TagUtils";
export class Tag extends TagsFilter {
    public key: string
    public value: string
    constructor(key: string, value: string) {
        super()
        this.key = key
        this.value = value
        if (key === undefined || key === "") {
            throw "Invalid key: undefined or empty";
        }
        if (value === undefined) {
            throw "Invalid value: value is undefined";
        }
        if (value === "*") {
            console.warn(`Got suspicious tag ${key}=*   ; did you mean ${key}~* ?`)
        }
    }
    matchesProperties(properties: any): boolean {
        for (const propertiesKey in properties) {
            if (this.key === propertiesKey) {
                const value = properties[propertiesKey];
                return value === this.value;
            }
        }
        // The tag was not found
        if (this.value === "") {
            // and it shouldn't be found!
            return true;
        }
        return false;
    }
    asOverpass(): string[] {
        if (this.value === "") {
            // NOT having this key
            return ['[!"' + this.key + '"]'];
        }
        return [`["${this.key}"="${this.value}"]`];
    }
    substituteValues(tags: any) {
        return new Tag(this.key, TagUtils.ApplyTemplate(this.value as string, tags));
    }
    asHumanString(linkToWiki: boolean, shorten: boolean) {
        let v = this.value;
        if (shorten) {
            v = Utils.EllipsesAfter(v, 25);
        }
        if (linkToWiki) {
            return `${this.key}` +
                `=` +
                `${v}`
        }
        return this.key + "=" + v;
    }
    isUsableAsAnswer(): boolean {
        return true;
    }
    isEquivalent(other: TagsFilter): boolean {
        if (other instanceof Tag) {
            return this.key === other.key && this.value === other.value;
        }
        if (other instanceof RegexTag) {
            other.isEquivalent(this);
        }
        return false;
    }
    usedKeys(): string[] {
        return [this.key];
    }
}