import { describe, it, expect } from 'vitest';
import { parseDashboardOverview } from '@/features/dashboard/types/dashboard.types';

const apiFixture = {
  audience: 'department',
  stats: {
    total_tickets: 1,
    open_tickets: 1,
    closed_tickets: 0,
    tickets_today: 1,
    avg_response_time_hours: 0,
    avg_resolution_time_hours: 0,
    sla_compliance_rate: 0,
    overdue_tickets: 0,
    tickets_this_week: 1,
    tickets_this_month: 1,
    sla_met: 0,
    sla_warning: 0,
    sla_breached: 0,
  },
  sla: {
    total: 0,
    met: 0,
    warning: 0,
    breached: 0,
    active: 0,
    paused: 0,
    compliance_rate: 0,
  },
  charts: {
    tickets_by_status: { labels: ['Open'], data: [1] },
    tickets_by_priority: { labels: ['Normal'], data: [1] },
    tickets_by_category: { labels: ['Uncategorized'], data: [1] },
    sla_status: { labels: ['Met'], data: [0] },
  },
  recent_tickets: [
    {
      id: 'ticket-1',
      ticket_number: 'VAL-1',
      subject: 'Subject VAL-1',
      department_id: 'dept-1',
      assignee_id: null,
      status: 'Open',
      priority: 'Normal',
      created_at: '2026-06-09T11:12:51Z',
      updated_at: '2026-06-09T11:12:51Z',
      closed_at: null,
    },
  ],
  recent_projects: [
    {
      id: 'project-1',
      name: 'Validator Project',
      key: 'VALP',
      status: 'active',
      department_id: 'dept-1',
      updated_at: '2026-06-09T11:12:51.000000Z',
    },
  ],
} as const;

describe('parseDashboardOverview', () => {
  it('parses a representative overview payload from the API', () => {
    const overview = parseDashboardOverview(apiFixture);

    expect(overview.audience).toBe('department');
    expect(overview.recent_projects).toHaveLength(1);
    expect(overview.recent_projects?.[0]?.key).toBe('VALP');
    expect(overview.charts.tickets_by_category.labels).toContain('Uncategorized');
  });

  it('unwraps Laravel-style data envelopes', () => {
    const overview = parseDashboardOverview({
      data: {
        audience: 'assignee',
        stats: {
          total_tickets: 1,
          open_tickets: 1,
          closed_tickets: 0,
          tickets_today: 0,
          avg_response_time_hours: 0,
          avg_resolution_time_hours: 0,
          sla_compliance_rate: 0,
          overdue_tickets: 0,
          tickets_this_week: 0,
          tickets_this_month: 0,
          sla_met: 0,
          sla_warning: 0,
          sla_breached: 0,
        },
        sla: {
          total: 0,
          met: 0,
          warning: 0,
          breached: 0,
          active: 0,
          paused: 0,
          compliance_rate: 0,
        },
        charts: {
          tickets_by_status: { labels: ['Open'], data: [1] },
          tickets_by_priority: { labels: ['Normal'], data: [1] },
          tickets_by_category: { labels: [], data: [] },
          sla_status: { labels: [], data: [] },
        },
        recent_tickets: [],
        recent_projects: null,
      },
    });

    expect(overview.audience).toBe('assignee');
    expect(overview.recent_projects).toEqual([]);
  });

  it('drops malformed recent project rows instead of failing the overview', () => {
    const overview = parseDashboardOverview({
      audience: 'department',
      stats: {
        total_tickets: 0,
        open_tickets: 0,
        closed_tickets: 0,
        tickets_today: 0,
        avg_response_time_hours: 0,
        avg_resolution_time_hours: 0,
        sla_compliance_rate: 0,
        overdue_tickets: 0,
        tickets_this_week: 0,
        tickets_this_month: 0,
        sla_met: 0,
        sla_warning: 0,
        sla_breached: 0,
      },
      sla: {
        total: 0,
        met: 0,
        warning: 0,
        breached: 0,
        active: 0,
        paused: 0,
        compliance_rate: 0,
      },
      charts: {
        tickets_by_status: { labels: [], data: [] },
        tickets_by_priority: { labels: [], data: [] },
      },
      recent_tickets: [],
      recent_projects: [
        {
          id: 'project-1',
          name: 'Valid Project',
          key: 'GOOD',
          status: 'active',
          department_id: 'dept-1',
          updated_at: '2026-06-09T11:00:00Z',
        },
        {
          id: 'project-2',
          name: 'Broken Project',
          key: null,
          status: 'active',
          updated_at: '2026-06-09T11:00:00Z',
        },
      ],
    });

    expect(overview.recent_projects).toHaveLength(1);
    expect(overview.recent_projects?.[0]?.key).toBe('GOOD');
  });
});
