import {
  DeesElement,
  customElement,
  html,
  css,
  cssManager,
  type TemplateResult,
} from '@design.estate/dees-element';
import type { DeesAppui } from '@design.estate/dees-catalog';
import '@design.estate/dees-catalog';
import '../elements/index.js';

declare global {
  interface HTMLElementTagNameMap {
    'sz-demo-app-shell': SzDemoAppShell;
  }
}

@customElement('sz-demo-app-shell')
export class SzDemoAppShell extends DeesElement {
  public static styles = [
    cssManager.defaultStyles,
    css`
      :host {
        display: block;
        height: 100%;
        width: 100%;
      }

      dees-appui {
        height: 100%;
        width: 100%;
      }
    `,
  ];

  public render(): TemplateResult {
    return html`
      <dees-appui></dees-appui>
    `;
  }

  async firstUpdated() {
    const appui = this.shadowRoot?.querySelector('dees-appui') as DeesAppui;

    if (!appui) return;

    // Configure the application shell
    appui.configure({
      branding: {
        logoIcon: 'lucide:Box',
        logoText: 'serve.zone',
      },
      appBar: {
        showSearch: true,
        breadcrumbs: 'serve.zone',
        menuItems: [
          {
            name: 'File',
            action: async () => {},
            submenu: [
              { name: 'New Service', shortcut: 'Cmd+N', action: async () => { console.log('New Service'); } },
              { name: 'Import Configuration', action: async () => { console.log('Import'); } },
              { name: 'Export Configuration', action: async () => { console.log('Export'); } },
              { divider: true },
              { name: 'Preferences', shortcut: 'Cmd+,', action: async () => { appui.navigateToView('settings'); } },
            ],
          },
          {
            name: 'View',
            action: async () => {},
            submenu: [
              { name: 'Dashboard', shortcut: 'Cmd+1', action: async () => { appui.navigateToView('dashboard'); } },
              { name: 'Services', shortcut: 'Cmd+2', action: async () => { appui.navigateToView('services'); } },
              { name: 'Network', shortcut: 'Cmd+3', action: async () => { appui.navigateToView('network'); } },
              { divider: true },
              { name: 'Activity Log', shortcut: 'Cmd+Shift+A', action: async () => { appui.toggleActivityLog(); } },
              { name: 'Toggle Sidebar', shortcut: 'Cmd+B', action: async () => { appui.setMainMenuCollapsed(!(appui as any).mainmenuCollapsed); } },
            ],
          },
          {
            name: 'Services',
            action: async () => {},
            submenu: [
              { name: 'Deploy New Service', action: async () => { console.log('Deploy'); } },
              { name: 'Start All', action: async () => { console.log('Start all'); } },
              { name: 'Stop All', action: async () => { console.log('Stop all'); } },
              { divider: true },
              { name: 'Garbage Collect', action: async () => { console.log('GC'); } },
            ],
          },
          {
            name: 'Help',
            action: async () => {},
            submenu: [
              { name: 'Documentation', action: async () => { window.open('https://docs.serve.zone', '_blank'); } },
              { name: 'Release Notes', action: async () => { console.log('Release notes'); } },
              { divider: true },
              { name: 'About serve.zone', action: async () => { console.log('About'); } },
            ],
          },
        ],
      },
      views: [
        {
          id: 'dashboard',
          name: 'Dashboard',
          iconName: 'lucide:LayoutDashboard',
          content: 'sz-demo-view-dashboard',
        },
        {
          id: 'services',
          name: 'Services',
          iconName: 'lucide:Server',
          content: 'sz-demo-view-services',
        },
        {
          id: 'network',
          name: 'Network',
          iconName: 'lucide:Network',
          content: 'sz-demo-view-network',
        },
        {
          id: 'registries',
          name: 'Registries',
          iconName: 'lucide:Archive',
          content: 'sz-demo-view-registries',
        },
        {
          id: 'tokens',
          name: 'Tokens',
          iconName: 'lucide:Key',
          content: 'sz-demo-view-tokens',
        },
        {
          id: 'mta',
          name: 'Email / MTA',
          iconName: 'lucide:Mail',
          content: 'sz-demo-view-mta',
        },
        {
          id: 'routes',
          name: 'Routes',
          iconName: 'lucide:Route',
          content: 'sz-demo-view-routes',
        },
        {
          id: 'settings',
          name: 'Settings',
          iconName: 'lucide:Settings',
          content: 'sz-demo-view-settings',
        },
      ],
      mainMenu: {
        sections: [
          {
            name: 'Overview',
            views: ['dashboard'],
          },
          {
            name: 'Infrastructure',
            views: ['services', 'network', 'registries', 'mta', 'routes'],
          },
          {
            name: 'Administration',
            views: ['tokens', 'settings'],
          },
        ],
      },
      defaultView: 'dashboard',
      onViewChange: (viewId, view) => {
        console.log('View changed to:', viewId, view);
      },
    });

    // Set user profile
    appui.setUser({
      name: 'Admin User',
      email: 'admin@serve.zone',
      status: 'online',
    });

    // Set profile menu items
    appui.setProfileMenuItems([
      { name: 'Profile', iconName: 'lucide:User', action: async () => { console.log('Profile'); } },
      { name: 'Preferences', iconName: 'lucide:SlidersHorizontal', action: async () => { console.log('Preferences'); } },
      { divider: true },
      { name: 'Sign Out', iconName: 'lucide:LogOut', action: async () => { console.log('Sign Out'); } },
    ]);
  }
}
