Vue.createApp({
    data() {
        return {
            loading: false,
            moreFilters: false,
            items: [],
            total: 0,
            // eslint-disable-next-line no-undef
            page: query.page || 1,
            totalPages: 1,
            limit: 16,
            artist: "",
            format: "",
            year: "",
            genre: "",
            style: "",
            sortOrder: "artists_sort-asc",
            sort: "artists_sort",
            order: "asc",
            itemId: null,
            showModalDelete: false,
            showModalShare: false,
            // eslint-disable-next-line no-undef
            shareLink: `/collection/${userId}`,
            // eslint-disable-next-line no-undef
            isPublicCollection,
            // eslint-disable-next-line no-undef
            query,
        };
    },
    created() {
        this.fetch();
    },
    methods: {
        formatParams(param) {
            return param.replace("&", "%26").replace("+", "%2B");
        },
        fetch() {
            this.loading = true;
            this.total = 0;

            const queryString = window.location.search;
            const urlParams = new URLSearchParams(queryString);
            const entries = urlParams.entries();

            const sortOrder = {
                sort: "artists_sort",
                order: "asc",
            };

            // eslint-disable-next-line no-restricted-syntax
            for (const entry of entries) {
                const [key, value] = entry;
                switch (key) {
                    case "artists_sort":
                        this.artist = value;
                        break;
                    default:
                        if (["order", "sort"].indexOf(key) !== -1) {
                            sortOrder[key] = value;
                        }
                        this[key] = value;
                }
            }

            this.sortOrder = `${sortOrder.sort}-${sortOrder.order}`;

            let url = `/api/v1/albums?page=${this.page}&limit=${this.limit}&sort=${this.sort}&order=${this.order}`;
            if (this.artist) {
                url += `&artist=${this.formatParams(this.artist)}`;
            }
            if (this.format) {
                url += `&format=${this.formatParams(this.format)}`;
            }
            if (this.year) {
                url += `&year=${this.year}`;
            }
            if (this.genre) {
                url += `&genre=${this.formatParams(this.genre)}`;
            }
            if (this.style) {
                url += `&style=${this.formatParams(this.style)}`;
            }

            axios
                .get(url)
                .then((response) => {
                    this.items = response.data.rows;
                    this.total = response.data.count || 0;
                    this.totalPages =
                        parseInt(response.data.count / this.limit, 10) +
                        (response.data.count % this.limit > 0 ? 1 : 0);
                })
                .catch((err) => {
                    showToastr(
                        err.response?.data?.message ||
                            "Impossible de charger votre collection"
                    );
                })
                .finally(() => {
                    this.loading = false;
                });
        },
        changeUrl() {
            let url = `?page=${this.page}&limit=${this.limit}&sort=${this.sort}&order=${this.order}`;
            if (this.artist) {
                url += `&artists_sort=${this.formatParams(this.artist)}`;
            }
            if (this.format) {
                url += `&format=${this.formatParams(this.format)}`;
            }
            if (this.year) {
                url += `&year=${this.year}`;
            }
            if (this.genre) {
                url += `&genre=${this.formatParams(this.genre)}`;
            }
            if (this.style) {
                url += `&style=${this.formatParams(this.style)}`;
            }

            window.location.href = url;
        },
        next(event) {
            event.preventDefault();

            this.page += 1;

            this.changeUrl();
        },
        previous(event) {
            event.preventDefault();

            this.page -= 1;

            this.changeUrl();
        },
        goTo(page) {
            this.page = page;

            this.changeUrl();
        },
        changeSort() {
            const [sort, order] = this.sortOrder.split("-");
            this.sort = sort;
            this.order = order;
            this.page = 1;

            this.changeUrl();
        },
        changeFilter() {
            this.page = 1;

            this.changeUrl();
        },
        showMoreFilters() {
            this.moreFilters = !this.moreFilters;
        },
        toggleModal() {
            this.showModalDelete = !this.showModalDelete;
        },
        toggleModalShare() {
            this.showModalShare = !this.showModalShare;
        },
        showConfirmDelete(itemId) {
            this.itemId = itemId;
            this.toggleModal();
        },
        deleteItem() {
            // eslint-disable-next-line no-undef
            if (vueType !== "private") {
                return false;
            }
            return axios
                .delete(`/api/v1/albums/${this.itemId}`)
                .then(() => {
                    this.fetch();
                })
                .catch((err) => {
                    showToastr(
                        err.response?.data?.message ||
                            "Impossible de supprimer cet album"
                    );
                })
                .finally(() => {
                    this.toggleModal();
                });
        },
        shareCollection() {
            // eslint-disable-next-line no-undef
            if (vueType !== "private") {
                return false;
            }
            return axios
                .patch(`/api/v1/me`, {
                    isPublicCollection: !this.isPublicCollection,
                })
                .then((res) => {
                    this.isPublicCollection = res.data.isPublicCollection;

                    if (this.isPublicCollection) {
                        showToastr(
                            "Votre collection est désormais publique",
                            true
                        );
                    } else {
                        showToastr(
                            "Votre collection n'est plus partagée",
                            true
                        );
                    }
                })
                .catch((err) => {
                    showToastr(
                        err.response?.data?.message ||
                            "Impossible de supprimer cet album"
                    );
                })
                .finally(() => {
                    this.toggleModalShare();
                });
        },
        renderAlbumTitle(item) {
            let render = "";

            for (let i = 0; i < item.artists.length; i += 1) {
                const { name, join } = item.artists[i];
                render += `${name} ${join ? `${join} ` : ""}`;
            }

            render += `- ${item.title}`;

            return render;
        },
    },
}).mount("#collection");