import { Suspense } from 'react';
import { redirect } from 'next/navigation';
import { getServerSession } from '@/lib/auth/getServerSession';
import { PERMISSIONS } from '@/lib/permissions/permissions';
import AccessDenied from '@/components/admin/errors/AccessDenied';
import AuditLogsTable from '@/components/admin/audit-logs/AuditLogsTable';
import { DepartmentTableSkeleton } from '@/components/ui/CustomSkeleton';
import { cookies } from 'next/headers';
import { SESSION_COOKIE } from '@/lib/auth/requireAuth';

async function getInitialLogs(sessionToken: string) {
  try {
    const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
    const res = await fetch(`${baseUrl}/api/audit-logs?page=1&limit=20`, {
      cache: 'no-store',
      headers: {
        'Authorization': `Bearer ${sessionToken}`
      }
    });
    
    if (!res.ok) {
      throw new Error('Failed to fetch audit logs');
    }
    
    const data = await res.json();
    return data.data;
  } catch (error) {
    console.error('Failed to fetch initial audit logs:', error);
    return {
      auditLogs: [],
      pagination: {
        page: 1,
        limit: 20,
        total: 0,
        totalPages: 0,
      },
    };
  }
}

async function getTables(sessionToken: string) {
  try {
    const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
    const res = await fetch(`${baseUrl}/api/audit-logs/tables`, {
      cache: 'no-store',
      headers: {
        'Authorization': `Bearer ${sessionToken}`
      }
    });
    
    if (!res.ok) {
      throw new Error('Failed to fetch tables');
    }
    
    const data = await res.json();
    return data.data || [];
  } catch (error) {
    console.error('Failed to fetch tables:', error);
    return [];
  }
}

async function AuditLogsContent() {
  const cookieStore = await cookies();
  const sessionId = cookieStore.get(SESSION_COOKIE)?.value;
  if (!sessionId) redirect('/admin/login');

  const session = await getServerSession();
  if (!session) redirect('/admin/login');

  if (!session.permissions.includes(PERMISSIONS.AUDIT_LOGS_READ)) {
    return <AccessDenied />;
  }
  
  const canViewDetails = session.permissions.includes(PERMISSIONS.AUDIT_LOGS_VIEW_DETAILS);
  
  const [initialData, tables] = await Promise.all([
    getInitialLogs(sessionId),
    getTables(sessionId),
  ]);
  
  return (
    <>
      <div className="mb-6">
        <h1 className="text-2xl font-semibold" style={{ color: 'var(--color-text)' }}>
          Audit Logs
        </h1>
        <p className="text-sm mt-1" style={{ color: 'var(--color-text-secondary)' }}>
          Track all system activities and changes across modules
        </p>
      </div>
      
      <AuditLogsTable 
        initialLogs={initialData}
        tables={tables}
        canViewDetails={canViewDetails}
      />
    </>
  );
}

export default async function AuditLogsPage() {
  return (
    <div className="sm:p-6">
      <Suspense fallback={<DepartmentTableSkeleton />}>
        <AuditLogsContent />
      </Suspense>
    </div>
  );
}