import { ToastService } from '@/core/services/toast.service';
import { AbstractDialog } from '@/shared/abstractClasses/abstract-dialog';
import { Component, computed, inject } from '@angular/core';
import { RouterLink } from '@angular/router';
import { SwUpdate, VersionReadyEvent } from '@angular/service-worker';
import { Button } from 'primeng/button';
import { Drawer } from 'primeng/drawer';
import { Ripple } from 'primeng/ripple';
import { filter } from 'rxjs';
import config from 'src/config';
import { posAboutNamedRoutes } from '../../modules/about/constants';
import { posConfigNamedRoutes } from '../../modules/configs/constants';
import { posSaleInvoicesNamedRoutes } from '../../modules/saleInvoices/constants';
import { posSupportNamedRoutes } from '../../modules/support/constants';
import { PosInfoStore } from '../../store';

@Component({
  selector: 'pos-main-menu-sidebar',
  templateUrl: './main-menu-sidebar.component.html',
  imports: [Drawer, Button, Ripple, RouterLink],
})
export class PosMainMenuSidebarComponent extends AbstractDialog {
  private readonly posInfoStore = inject(PosInfoStore);
  private readonly swUpdate = inject(SwUpdate);
  private readonly toastService = inject(ToastService);

  readonly posInfo = computed(() => this.posInfoStore.entity());
  appVersion = '0.0.0';
  isPwaBuild = false;

  readonly posName = computed(() => {
    if (this.posInfo()) {
      const { name, businessActivity, complex } = this.posInfo()!;
      return `${name} (${businessActivity.name} - ${complex.name})`;
    }
    return '';
  });

  readonly menuItems = [
    {
      label: 'فروش',
      routerLink: config.isPosApplication ? '/' : '/pos',
      icon: 'pi pi-fw pi-home',
    },
    {
      label: 'فاکتورها',
      routerLink: posSaleInvoicesNamedRoutes.saleInvoices.meta.pagePath!(),
      icon: 'pi pi-fw pi-receipt',
    },
    {
      label: 'تنظیمات',
      routerLink: posConfigNamedRoutes.config.meta.pagePath!(),
      icon: 'pi pi-fw pi-cog',
    },
    {
      label: 'درباره ما',
      routerLink: posAboutNamedRoutes.about.meta.pagePath!(),
      icon: 'pi pi-fw pi-info-circle',
    },
    {
      label: 'پشتیبانی',
      routerLink: posSupportNamedRoutes.support.meta.pagePath!(),
      icon: 'pi pi-fw pi-phone',
    },
  ];

  ngOnInit() {
    this.isPwaBuild = this.swUpdate.isEnabled;

    if (!this.isPwaBuild) return;

    fetch('/ngsw.json')
      .then((res) => res.json())
      .then((data: { appData?: { appVersion?: string } }) => {
        this.appVersion = data?.appData?.appVersion || this.appVersion;
        this.toastService.info({ text: this.appVersion });
      })
      .catch((err) => {
        console.log('err', err);
      });

    this.swUpdate.versionUpdates
      .pipe(filter((event): event is VersionReadyEvent => event.type === 'VERSION_READY'))
      .subscribe((event) => {
        const appData = event.latestVersion.appData as { appVersion?: string } | undefined;
        this.appVersion = appData?.appVersion || this.appVersion;
      });

    this.swUpdate.checkForUpdate().catch(() => {});
  }
}
