import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { map } from 'rxjs/operators';

export interface MobileMenuNotification {
  type: 'meli' | 'dashboard' | 'old-vehicles' | 'drivers' | 'sidebar' | 'vehicles';
  count: number;
  message: string;
  timestamp: Date;
}

@Injectable({
  providedIn: 'root'
})
export class MobileMenuService {
  private notificationsSubject = new BehaviorSubject<MobileMenuNotification[]>([]);
  private visibilitySubject = new BehaviorSubject<boolean>(this.isMobileDevice());
  
  // ✅ NOVO: Gerenciamento do estado da sidebar mobile
  private sidebarVisibleSubject = new BehaviorSubject<boolean>(false);

  public notifications$ = this.notificationsSubject.asObservable();
  public visibility$ = this.visibilitySubject.asObservable();
  
  // ✅ NOVO: Observable para estado da sidebar mobile
  public sidebarVisible$ = this.sidebarVisibleSubject.asObservable();

  constructor() {
    this.initializeNotifications();
    this.checkDeviceType();
    
    // ✅ Listener para mudanças de tamanho de tela
    window.addEventListener('resize', () => {
      this.checkDeviceType();
      
      // Se mudou para desktop, ocultar sidebar mobile
      if (!this.isMobileDevice()) {
        this.setSidebarVisible(false);
      }
    });
  }

  /**
   * Inicializa as notificações padrão
   */
  private initializeNotifications() {
    const defaultNotifications: MobileMenuNotification[] = [
      { type: 'meli', count: 0, message: 'Novas rotas disponíveis', timestamp: new Date() },
      { type: 'dashboard', count: 0, message: '', timestamp: new Date() },
      { type: 'old-vehicles', count: 0, message: 'Manutenção pendente', timestamp: new Date() },
      { type: 'sidebar', count: 0, message: '', timestamp: new Date() }
    ];

    this.notificationsSubject.next(defaultNotifications);
  }

  /**
   * Verifica se é dispositivo móvel e controla visibilidade
   */
  private checkDeviceType(): void {
    const isMobile = this.isMobileDevice();
    this.visibilitySubject.next(isMobile);
    
    // Se não é mobile, garantir que sidebar está visível
    if (!isMobile) {
      this.setSidebarVisible(false);
    }
  }

  private isMobileDevice(): boolean {
    return window.innerWidth <= 768;
  }

  /**
   * Atualiza notificação para um tipo específico
   */
  updateNotification(type: MobileMenuNotification['type'], count: number, message?: string): void {
    const currentNotifications = this.notificationsSubject.value;
    const existingIndex = currentNotifications.findIndex(n => n.type === type);

    if (existingIndex >= 0) {
      // Atualizar notificação existente
      currentNotifications[existingIndex] = {
        type,
        count: Math.max(0, count),
        message: message || currentNotifications[existingIndex].message,
        timestamp: new Date()
      };
    } else {
      // Adicionar nova notificação
      currentNotifications.push({
        type,
        count: Math.max(0, count),
        message: message || '',
        timestamp: new Date()
      });
    }

    this.notificationsSubject.next([...currentNotifications]);
    console.log(`📱 Notificação atualizada para ${type}: ${count}`);
  }

  /**
   * Obtem notificação para um tipo específico
   */
  getNotification(type: string): Observable<MobileMenuNotification | undefined> {
    return this.notifications$.pipe(
      map(notifications => notifications.find(n => n.type === type))
    );
  }

  /**
   * Limpa notificação para um tipo específico
   */
  clearNotification(type: string): void {
    this.updateNotification(type as MobileMenuNotification['type'], 0);
  }

  /**
   * Incrementa notificação
   */
  incrementNotification(type: string, message?: string): void {
    const current = this.getNotificationCount(type as MobileMenuNotification['type']);
    this.updateNotification(type as MobileMenuNotification['type'], current + 1, message);
  }

  /**
   * Força a visibilidade do menu (para testes)
   */
  setVisibility(visible: boolean): void {
    this.visibilitySubject.next(visible);
  }

  /**
   * Métodos de conveniência para notificações específicas
   */
  
  setMeliNotifications(count: number, message?: string): void {
    this.updateNotification('meli', count, message);
  }

  setVehicleNotifications(count: number, message?: string): void {
    this.updateNotification('old-vehicles', count, message);
  }

  setDashboardNotifications(count: number, message?: string): void {
    this.updateNotification('dashboard', count, message);
  }

  setSidebarNotifications(count: number, message?: string): void {
    this.updateNotification('sidebar', count, message);
  }

  /**
   * Simula atualizações de notificações (para demo/desenvolvimento)
   * ⚠️ DESABILITADO PARA PRODUÇÃO
   * Será reabilitado quando conectar com APIs reais ou WebSocket
   */
  startDemoNotifications(): void {
    console.log('⚠️ Demo de notificações está desabilitado para produção');
    console.log('💡 Para habilitar: conectar com APIs/WebSocket reais');
    
    // ✅ DEMO DESABILITADO PARA PRODUÇÃO
    // Descomentar quando implementar APIs reais
    /*
    console.log('🧪 Iniciando demo de notificações...');
    
    // Simular novas rotas Meli
    setTimeout(() => {
      this.setMeliNotifications(3, 'Novas rotas disponíveis');
    }, 3000);

    // Simular alerta de veículo
    setTimeout(() => {
      this.setVehicleNotifications(1, 'Manutenção pendente');
    }, 6000);

    // Limpar notificações após um tempo
    setTimeout(() => {
      this.clearNotification('meli');
    }, 10000);
    */
  }

  /**
   * 🚀 MÉTODOS PARA INTEGRAÇÃO COM APIs REAIS
   * Use estes métodos quando implementar conexões reais
   */

  /**
   * Conecta com WebSocket para notificações em tempo real
   * @param webSocketUrl URL do WebSocket
   */
  connectWebSocket(webSocketUrl: string): void {
    console.log('🔌 TODO: Implementar conexão WebSocket para notificações');
    console.log('📡 URL:', webSocketUrl);
    
    // TODO: Implementar WebSocket real
    // const ws = new WebSocket(webSocketUrl);
    // ws.onmessage = (event) => {
    //   const notification = JSON.parse(event.data);
    //   this.updateNotification(notification.type, notification.count, notification.message);
    // };
  }

  /**
   * Carrega notificações via API GET
   * @param apiUrl URL da API de notificações
   */
  async loadNotificationsFromAPI(apiUrl: string): Promise<void> {
    console.log('📡 TODO: Implementar carregamento via API');
    console.log('🌐 URL:', apiUrl);
    
    // TODO: Implementar fetch real
    // try {
    //   const response = await fetch(apiUrl);
    //   const notifications = await response.json();
    //   
    //   notifications.forEach(notification => {
    //     this.updateNotification(notification.type, notification.count, notification.message);
    //   });
    // } catch (error) {
    //   console.error('❌ Erro ao carregar notificações:', error);
    // }
  }

  /**
   * Marca notificação como lida via API
   * @param type Tipo da notificação
   * @param apiUrl URL da API para marcar como lida
   */
  async markAsReadAPI(type: string, apiUrl: string): Promise<void> {
    console.log('✅ TODO: Implementar marca como lida via API');
    console.log('🎯 Tipo:', type, 'URL:', apiUrl);
    
    // TODO: Implementar POST/PUT real
    // try {
    //   await fetch(apiUrl, {
    //     method: 'POST',
    //     body: JSON.stringify({ type, timestamp: new Date() })
    //   });
    //   this.clearNotification(type);
    // } catch (error) {
    //   console.error('❌ Erro ao marcar como lida:', error);
    // }
  }

  // ✅ NOVO: Controlar visibilidade da sidebar mobile
  setSidebarVisible(visible: boolean): void {
    if (this.isMobileDevice()) {
      this.sidebarVisibleSubject.next(visible);
      console.log('📱 Sidebar mobile:', visible ? 'visível' : 'oculta');
    }
  }

  // ✅ NOVO: Toggle da sidebar mobile
  toggleSidebar(): void {
    if (this.isMobileDevice()) {
      const currentState = this.sidebarVisibleSubject.value;
      this.setSidebarVisible(!currentState);
    }
  }

  // ✅ NOVO: Getter para estado atual da sidebar
  get isSidebarVisible(): boolean {
    return this.sidebarVisibleSubject.value;
  }

  private getNotificationCount(type: MobileMenuNotification['type']): number {
    const notification = this.notificationsSubject.value.find(n => n.type === type);
    return notification?.count || 0;
  }
} 