import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import api from '@/lib/api';

const REPORTS_KEY = 'reports';

export type ReportFormat = 'pdf' | 'csv';
export type ReportStatus = 'pending' | 'processing' | 'completed' | 'failed';
export type ReportSection = 'summary' | 'costs' | 'metrics' | 'logs' | 'pii';

export interface Report {
  id: string;
  scenario_id: string;
  format: ReportFormat;
  status: ReportStatus;
  created_at: string;
  completed_at?: string;
  file_size?: number;
  file_path?: string;
  error_message?: string;
  sections: ReportSection[];
  date_from?: string;
  date_to?: string;
}

export interface ReportList {
  items: Report[];
  total: number;
}

export interface GenerateReportRequest {
  format: ReportFormat;
  include_logs?: boolean;
  date_from?: string;
  date_to?: string;
  sections: ReportSection[];
}

export function useReports(scenarioId: string) {
  return useQuery<ReportList>({
    queryKey: [REPORTS_KEY, scenarioId],
    queryFn: async () => {
      const response = await api.get(`/scenarios/${scenarioId}/reports`);
      return response.data;
    },
    enabled: !!scenarioId,
  });
}

export function useReport(reportId: string) {
  return useQuery<Report>({
    queryKey: [REPORTS_KEY, 'detail', reportId],
    queryFn: async () => {
      const response = await api.get(`/reports/${reportId}`);
      return response.data;
    },
    enabled: !!reportId,
  });
}

export function useGenerateReport(scenarioId: string) {
  const queryClient = useQueryClient();
  
  return useMutation<Report, Error, GenerateReportRequest>({
    mutationFn: async (data) => {
      const response = await api.post(`/scenarios/${scenarioId}/reports`, data);
      return response.data;
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: [REPORTS_KEY, scenarioId] });
    },
  });
}

export function useDownloadReport() {
  return useMutation<Blob, Error, { reportId: string; fileName: string }>({
    mutationFn: async ({ reportId }) => {
      const response = await api.get(`/reports/${reportId}/download`, {
        responseType: 'blob',
      });
      return response.data;
    },
  });
}

export function useDeleteReport(scenarioId: string) {
  const queryClient = useQueryClient();
  
  return useMutation<void, Error, string>({
    mutationFn: async (reportId) => {
      await api.delete(`/reports/${reportId}`);
    },
    onSuccess: () => {
      queryClient.invalidateQueries({ queryKey: [REPORTS_KEY, scenarioId] });
    },
  });
}

export function formatFileSize(bytes?: number): string {
  if (!bytes) return '-';
  if (bytes < 1024) return `${bytes} B`;
  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
  return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
}

export function getStatusBadgeVariant(status: ReportStatus): 'default' | 'secondary' | 'destructive' | 'outline' {
  switch (status) {
    case 'completed':
      return 'default';
    case 'processing':
      return 'secondary';
    case 'failed':
      return 'destructive';
    case 'pending':
      return 'outline';
    default:
      return 'default';
  }
}
