import { Component, OnInit, inject, signal } from '@angular/core';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu';
import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterLink } from '@angular/router';
import { GatewayService } from '../gateway/gateway.service';
import { ThemeService } from '../theme/theme.service';

// TODO(b/514573802): Update the link to show the new Pinpoint documentation.
export const DOCUMENTATION_URL =
  'https://chromium.googlesource.com/catapult/+/HEAD/dashboard/dashboard/pinpoint/README.md';
export const BUG_REPORT_URL =
  'https://b.corp.google.com/issues/new?component=1970595&template=2325183';

@Component({
  selector: 'app-header',
  standalone: true,
  imports: [
    MatToolbarModule,
    MatButtonModule,
    MatIconModule,
    MatMenuModule,
    RouterLink,
    MatTooltipModule,
  ],
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.css'],
})
export class HeaderComponent implements OnInit {
  private gatewayService = inject(GatewayService);

  private themeService = inject(ThemeService);

  userEmail = signal<string>('Loading...');

  isDarkMode = this.themeService.isDarkMode;

  ngOnInit() {
    this.loadUserInfo();
  }

  toggleTheme() {
    this.themeService.toggleTheme();
  }

  private async loadUserInfo() {
    try {
      const res = await this.gatewayService.GetUserInfo({});
      this.userEmail.set(res.email || 'Unknown user');
    } catch (err) {
      console.error('Failed to load user info:', err);
      this.userEmail.set('Error loading user');
    }
  }

  onHelpClick() {
    window.open(DOCUMENTATION_URL, '_blank');
  }

  onBugClick() {
    window.open(BUG_REPORT_URL, '_blank');
  }

  onSignOutClick() {
    const redirectUrl = encodeURIComponent(window.location.origin);
    this.redirect(`/logout/?redirect=${redirectUrl}`);
  }

  redirect(url: string) {
    window.location.href = url;
  }
}
