import { products_loader } from "./products_loader.js";
import { product_containers } from "./product_containers.js";

export class searcher {
    #input;
    #category;
    #manager;
    #result;
    #counter;

    static #instances;

    static #add(instance) {
        if (typeof(searcher.#instances) !== "object") {
            searcher.#instances = new Array();
        }

        searcher.#instances.push(instance);
    }

    static reload() {
        if (typeof(searcher.#instances) !== "object") {
            return ;
        }

        searcher.#instances.forEach(instance => {
            instance.update();
        });
    }
    
    constructor(search_form, manager, result, counter) {
        this.#input = search_form.querySelector("input[type=\"text\"]");
        this.#category = search_form.querySelector("select");
        this.#manager = manager;
        this.#result = result;
        this.#counter = counter;

        this.#selector_complete();
        search_form.addEventListener("submit", (target) => {
            target.preventDefault();
            this.update();
        });

        searcher.#add(this);
    }

    get categories() {
        return {
            "name": _("name-category"),
            "author": _("author-category"),
            "barcode": _("barcode-category"),
        }
    }

    #selector_complete() {
        const category = this.#category;
        const categories = this.categories;

        Object.keys(categories).forEach(name => {
            const option = document.createElement("option");
            option.value = name;
            option.innerText = categories[name];
        
            category.appendChild(option);
        });
    }

    get #loader() {
        return {
            "name": products_loader.search_name,
            "author": products_loader.search_author,
            "barcode": products_loader.search_barcode,
        }[this.category];
    }

    get category() {
        return this.#category.value;
    }

    get phrase() {
        return this.#input.value.trim();
    }

    get #result_title() {
        return this.#result.innerText;
    }

    set #result_title(target) {
        this.#result.innerText = target;
    }

    async update() {
        if (this.phrase.length === 0) {
            this.show_all();
            return;
        }

        this.#insert(await this.#loader(this.phrase));
    }

    set #how_many(target) { 
        this.#counter.innerText = _("found-count") + target;
    }

    get #how_many() {
        return this.#counter.innerText;
    }

    #insert(list) {
        if (list.length === 0) {
            this.#result_title = _("not-found-anything");
        } else {
            this.#result_title = _("browse-our-products");
        }

        this.#how_many = list.length;

        this.#manager
        .clean()
        .add_list(list)
        .update();
    }

    async show_all() {
        this.#insert(await products_loader.all())
    }
}
