import * as i0 from '@angular/core';
import { Inject, Optional, Injectable } from '@angular/core';
import { SD_CORE_CONFIGURATION } from '@sd-angular/core/configurations';

class SdLicenseService {
    coreConfiguration;
    #SALT = 'angular-core-976e2fa6f8b44dadbc63f87b057a331f';
    #isValid = false;
    constructor(coreConfiguration) {
        this.coreConfiguration = coreConfiguration;
        this.#verify();
    }
    enforceLicense = () => {
        if (!this.#isValid) {
            this.#throwSecurityError();
        }
    };
    #verify = () => {
        const hostname = window.location.hostname; // Ví dụ: store.uat.nexa.mobi
        // 1. Bypass Localhost
        if (this.#isLocalhost(hostname)) {
            console.log('%c [SdAngularCore] Dev Mode ', 'background: #222; color: #bada55');
            this.#isValid = true;
            return;
        }
        const configKeys = this.#getConfiguredKeys();
        if (configKeys.length === 0) {
            this.#isValid = false;
            this.#throwSecurityError();
            return;
        }
        // 2. CHECK EXACT MATCH (Ưu tiên khớp chính xác 100%)
        // Hash chuỗi: "store.uat.nexa.mobi" + SALT
        if (this.#checkMatch(hostname, configKeys)) {
            this.#isValid = true;
            return;
        }
        // 3. CHECK WILDCARD MATCH (Thử các trường hợp có dấu *)
        const parts = hostname.split('.'); // ["store", "uat", "nexa", "mobi"]
        // Lặp để cắt dần subdomain bên trái và thêm "*." vào
        // Điều kiện > 2 để đảm bảo không check các case vô nghĩa như *.mobi hay *.com
        while (parts.length > 2) {
            parts.shift(); // Bỏ phần đầu: ["uat", "nexa", "mobi"]
            // Tạo domain wildcard: "*.uat.nexa.mobi"
            const wildcardDomain = '*.' + parts.join('.');
            // Hash chuỗi: "*.uat.nexa.mobi" + SALT
            if (this.#checkMatch(wildcardDomain, configKeys)) {
                this.#isValid = true;
                return;
            }
        }
        // Nếu chạy hết vòng lặp mà không khớp cái nào
        this.#isValid = false;
        this.#throwSecurityError();
    };
    // Helper để check xem hash của input có nằm trong list key không
    #checkMatch = (inputString, validKeys) => {
        const hash = this.#generateHash(inputString + this.#SALT);
        return validKeys.includes(hash);
    };
    #getConfiguredKeys = () => {
        const keyOrKeys = this.coreConfiguration?.licenseKey;
        if (!keyOrKeys)
            return [];
        return Array.isArray(keyOrKeys) ? keyOrKeys : [keyOrKeys];
    };
    #isLocalhost = (domain) => {
        return domain === 'localhost' || domain === '127.0.0.1' || domain.includes('localhost');
    };
    #generateHash = (input) => {
        let hash = 0;
        if (input.length === 0)
            return hash.toString();
        for (let i = 0; i < input.length; i++) {
            const char = input.charCodeAt(i);
            hash = (hash << 5) - hash + char;
            hash = hash & hash;
        }
        return btoa(hash.toString() + 'signed');
    };
    #throwSecurityError = () => {
        throw new Error(`[Security] Unauthorized usage of UI Lib on domain: ${window.location.hostname}`);
    };
    static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdLicenseService, deps: [{ token: SD_CORE_CONFIGURATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
    static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdLicenseService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: SdLicenseService, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                }]
        }], ctorParameters: () => [{ type: undefined, decorators: [{
                    type: Inject,
                    args: [SD_CORE_CONFIGURATION]
                }, {
                    type: Optional
                }] }] });

/**
 * Generated bundle index. Do not edit.
 */

export { SdLicenseService };
//# sourceMappingURL=sd-angular-core-services-license.mjs.map
