// src/client/entities/system/model/system.store.ts
// System entity - Pinia store for log configuration management

import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
import { systemRepository } from '../../../shared/api/repositories';
import type {
  UpdateLogConfigRequest,
  LogChannel,
  LogLevel,
} from '@shared/contracts/logger';

/**
 * System Store - manages log configuration
 */
export const useSystemStore = defineStore('system', () => {
  // State
  const logConfig = ref<Record<LogChannel, LogLevel>>({
    SYSTEM: 'info',
    HTTP: 'info',
    DB: 'info',
    SOCKET: 'info',
    AUTH: 'info',
    CRON: 'info',
  });

  const isLoading = ref(false);
  const error = ref<string | null>(null);

  // Computed
  const channels = computed<LogChannel[]>(() => {
    return Object.keys(logConfig.value) as LogChannel[];
  });

  const levels = computed<LogLevel[]>(() => {
    return ['debug', 'info', 'warn', 'error', 'silent'];
  });

  /**
   * Get the current log level for a specific channel
   */
  function getChannelLevel(channel: LogChannel): LogLevel {
    return logConfig.value[channel];
  }

  /**
   * Get color class for a log level
   */
  function getLevelColor(level: LogLevel): string {
    switch (level) {
      case 'debug':
        return 'bg-purple-500';
      case 'info':
        return 'bg-green-500';
      case 'warn':
        return 'bg-amber-500';
      case 'error':
        return 'bg-red-500';
      case 'silent':
        return 'bg-gray-400';
      default:
        return 'bg-gray-500';
    }
  }

  /**
   * Get border color class for a log level (for card borders)
   */
  function getLevelBorderColor(level: LogLevel): string {
    switch (level) {
      case 'debug':
        return 'border-purple-400';
      case 'info':
        return 'border-green-400';
      case 'warn':
        return 'border-amber-400';
      case 'error':
        return 'border-red-400';
      case 'silent':
        return 'border-gray-300';
      default:
        return 'border-gray-300';
    }
  }

  /**
   * Get background accent color class for a log level (for card backgrounds)
   */
  function getLevelBgAccent(level: LogLevel): string {
    switch (level) {
      case 'debug':
        return 'bg-purple-50';
      case 'info':
        return 'bg-green-50';
      case 'warn':
        return 'bg-amber-50';
      case 'error':
        return 'bg-red-50';
      case 'silent':
        return 'bg-gray-50';
      default:
        return 'bg-gray-50';
    }
  }

  /**
   * Get text color class for a log level
   */
  function getLevelTextColor(level: LogLevel): string {
    switch (level) {
      case 'debug':
        return 'text-purple-600';
      case 'info':
        return 'text-green-600';
      case 'warn':
        return 'text-amber-600';
      case 'error':
        return 'text-red-600';
      case 'silent':
        return 'text-gray-600';
      default:
        return 'text-gray-600';
    }
  }

  /**
   * Fetch log configuration from the server
   * FIXED: Repository returns raw config object, not wrapped response
   */
  async function fetchLogConfig() {
    isLoading.value = true;
    error.value = null;

    try {
      // Repository returns RAW config: { SYSTEM: 'silent', ... }
      const config = await systemRepository.getLogConfig();

      // Fix: Direct assignment - no .data or .success wrapper
      if (config) {
        logConfig.value = config;
      }
    } catch (err) {
      error.value = err instanceof Error ? err.message : 'Failed to fetch log configuration';
      throw err;
    } finally {
      isLoading.value = false;
    }
  }

  /**
   * Update log level for a specific channel
   * FIXED: Repository returns raw config object, not wrapped response
   */
  async function updateChannelLevel(channel: LogChannel, level: LogLevel) {
    isLoading.value = true;
    error.value = null;

    try {
      const request: UpdateLogConfigRequest = { channel, level };
      
      // Repository returns RAW config: { SYSTEM: 'silent', ... }
      const config = await systemRepository.updateLogConfig(request);

      // Fix: Direct assignment - no .data or .success wrapper
      if (config) {
        logConfig.value = config;
      }
    } catch (err) {
      error.value = err instanceof Error ? err.message : 'Failed to update log configuration';
      throw err;
    } finally {
      isLoading.value = false;
    }
  }

  /**
   * Reset log configuration to defaults
   */
  function resetToDefaults() {
    logConfig.value = {
      SYSTEM: 'info',
      HTTP: 'info',
      DB: 'info',
      SOCKET: 'info',
      AUTH: 'info',
      CRON: 'info',
    };
  }

  return {
    // State
    logConfig,
    isLoading,
    error,
    // Computed
    channels,
    levels,
    // Actions
    getChannelLevel,
    getLevelColor,
    getLevelBorderColor,
    getLevelBgAccent,
    getLevelTextColor,
    fetchLogConfig,
    updateChannelLevel,
    resetToDefaults,
  };
});
