import { describe, expect, it } from 'vitest';

import { buildWaterTrendModels, createWaterTrendOption } from '../waterTrend';

const records = [
  {
    ceshi_jieguo: 0.12,
    jianyan_xiang_id: 'toc-result-1',
    jianyan_riqi: '2026-01-03',
    jianyan_xiangmu_id: 'toc',
    quyangdian_id: 'p-1',
    quyangdian_mingcheng: 'PW201',
    renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
  },
  {
    ceshi_jieguo: null,
    jianyan_xiang_id: 'toc-result-2',
    jianyan_riqi: '2026-01-10',
    jianyan_xiangmu_id: 'toc',
    quyangdian_id: 'p-1',
    quyangdian_mingcheng: 'PW201',
    renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
  },
  {
    ceshi_jieguo: 0.15,
    jianyan_xiang_id: 'toc-result-3',
    jianyan_riqi: '2026-01-10',
    jianyan_xiangmu_id: 'toc',
    quyangdian_id: 'p-2',
    quyangdian_mingcheng: 'PW201',
    renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
  },
  {
    ceshi_jieguo: 6.1,
    jianyan_xiang_id: 'ph-result-1',
    jianyan_riqi: '2026-01-03',
    jianyan_xiangmu_id: 'ph',
    quyangdian_id: 'p-1',
    quyangdian_mingcheng: 'PW201',
    renwu_jianyan_xiang_kuaizhao_id: 'ph-snapshot',
  },
];

describe('water trend models', () => {
  it('keeps same-named sampling points separate and fills missing dates with null', () => {
    const items = [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }];
    const standards = [
      {
        biaozhun_shangxian: 0.5,
        jianyan_xiangmu_id: 'toc',
        renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
        trend_enabled: true,
        unit: 'mg/L',
      },
    ];

    const [model] = buildWaterTrendModels({ items, records, standards });

    expect(model?.categories).toEqual(['2026-01-03', '2026-01-10', '2026-01-10']);
    expect(model?.series).toEqual([
      { data: [0.5, 0.5, 0.5], id: 'upper-limit', kind: 'limit', name: '最高限' },
      { data: [0.12, null, null], id: 'point-p-1', kind: 'record', name: 'PW201' },
      { data: [null, null, 0.15], id: 'point-p-2', kind: 'record', name: 'PW201' },
    ]);
  });

  it('includes pH limits and omits disabled items', () => {
    const items = [
      { id: 'ph', name: 'pH', trend_enabled: true, unit: '' },
      { id: 'character', name: '性状', trend_enabled: false, unit: '' },
    ];
    const standards = [
      {
        biaozhun_shangxian: 7,
        biaozhun_xiaxian: 5,
        jianyan_xiangmu_id: 'ph',
        renwu_jianyan_xiang_kuaizhao_id: 'ph-snapshot',
        trend_enabled: true,
        unit: 'pH',
      },
      {
        jianyan_xiangmu_id: 'character',
        renwu_jianyan_xiang_kuaizhao_id: 'character-snapshot',
        trend_enabled: false,
        unit: '',
      },
    ];

    const models = buildWaterTrendModels({ items, records, standards });

    expect(models).toHaveLength(1);
    expect(models[0]?.series).toMatchObject([
      { data: [5], name: '最低限' },
      { data: [7], name: '最高限' },
      { data: [6.1], name: 'PW201' },
    ]);
  });

  it('ignores records without an inspection date', () => {
    const models = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records: [
        ...records,
        {
          ceshi_jieguo: 0.2,
          jianyan_xiang_id: 'toc-result-empty',
          jianyan_riqi: '',
          jianyan_xiangmu_id: 'toc',
          quyangdian_id: 'p-1',
          quyangdian_mingcheng: 'PW201',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
        },
      ],
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });

    expect(models[0]?.categories).toEqual(['2026-01-03', '2026-01-10', '2026-01-10']);
  });

  it('normalizes non-finite measurements to null', () => {
    const [model] = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records: [
        ...records,
        {
          ceshi_jieguo: Number.NaN,
          jianyan_xiang_id: 'toc-result-nan',
          jianyan_riqi: '2026-01-03',
          jianyan_xiangmu_id: 'toc',
          quyangdian_id: 'p-3',
          quyangdian_mingcheng: 'PW202',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
        },
      ],
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });

    expect(model?.series.find((series) => series.id === 'point-p-3')?.data).toEqual([null, null, null, null]);
  });

  it('does not create a chart when the matching quality standard disables trending', () => {
    const models = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records,
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: false,
          unit: 'mg/L',
        },
      ],
    });

    expect(models).toEqual([]);
  });

  it('does not create a chart when an enabled item has no dated records', () => {
    const models = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records: [],
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });

    expect(models).toEqual([]);
  });

  it('groups records by their task snapshot standard instead of mixing standard versions', () => {
    const models = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records: [
        {
          ceshi_jieguo: 0.12,
          jianyan_riqi: '2026-01-03 08:00:00',
          jianyan_xiang_id: 'result-v1',
          jianyan_xiangmu_id: 'toc',
          quyangdian_id: 'p-1',
          quyangdian_mingcheng: 'PW201',
          renwu_jianyan_xiang_kuaizhao_id: 'snapshot-v1',
        },
        {
          ceshi_jieguo: 0.08,
          jianyan_riqi: '2026-02-03 08:00:00',
          jianyan_xiang_id: 'result-v2',
          jianyan_xiangmu_id: 'toc',
          quyangdian_id: 'p-1',
          quyangdian_mingcheng: 'PW201',
          renwu_jianyan_xiang_kuaizhao_id: 'snapshot-v2',
        },
      ],
      standards: [
        {
          biaozhun_banben: '2026',
          biaozhun_bianhao: 'GB-2',
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'snapshot-v1',
          trend_enabled: true,
          unit: 'mg/L',
        },
        {
          biaozhun_banben: '2027',
          biaozhun_bianhao: 'GB-3',
          biaozhun_shangxian: 0.2,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'snapshot-v2',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });

    expect(models).toHaveLength(2);
    expect(models.map((model) => model.standard.biaozhun_banben)).toEqual(['2026', '2027']);
    expect(models.map((model) => model.series.find((series) => series.kind === 'record')?.data)).toEqual([[0.12], [0.08]]);
  });

  it('renders limits as named dashed lines and preserves a scrollable legend', () => {
    const [model] = buildWaterTrendModels({
      items: [{ id: 'ph', name: 'pH', trend_enabled: true, unit: '' }],
      records,
      standards: [
        {
          biaozhun_banben: '2026',
          biaozhun_bianhao: 'GB-2',
          biaozhun_shangxian: 7,
          biaozhun_xiaxian: 5,
          jianyan_xiangmu_id: 'ph',
          renwu_jianyan_xiang_kuaizhao_id: 'ph-snapshot',
          trend_enabled: true,
          unit: '',
        },
      ],
    });

    if (!model) throw new Error('Expected pH trend model');

    const option = createWaterTrendOption(model, '2026-01-01~2026-01-31 纯化水 pH 趋势分析图');

    expect(option).toMatchObject({
      graphic: { style: { text: '标准编号：GB-2；版本：2026' } },
      legend: { type: 'scroll' },
      yAxis: { name: '检测值' },
    });
    expect(option.series).toEqual(
      expect.arrayContaining([
        expect.objectContaining({
          lineStyle: expect.objectContaining({ type: 'dashed' }),
          name: '最低限',
        }),
        expect.objectContaining({
          lineStyle: expect.objectContaining({ type: 'dashed' }),
          name: '最高限',
        }),
      ]),
    );
  });

  it('distinguishes same-named sampling points in chart legends', () => {
    const [model] = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records,
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });
    if (!model) throw new Error('Expected TOC trend model');

    const option = createWaterTrendOption(model, 'TOC 趋势分析图');

    expect(option.legend).toMatchObject({
      data: ['最高限', 'PW201（p-1）', 'PW201（p-2）'],
    });
  });

  it('renders measurements as bars while keeping limits as lines', () => {
    const [model] = buildWaterTrendModels({
      items: [{ id: 'toc', name: '总有机碳', trend_enabled: true, unit: 'mg/L' }],
      records,
      standards: [
        {
          biaozhun_shangxian: 0.5,
          jianyan_xiangmu_id: 'toc',
          renwu_jianyan_xiang_kuaizhao_id: 'toc-snapshot',
          trend_enabled: true,
          unit: 'mg/L',
        },
      ],
    });
    if (!model) throw new Error('Expected TOC trend model');

    const option = createWaterTrendOption(model, 'TOC 直方图', 'bar');

    expect(option.series).toEqual(
      expect.arrayContaining([expect.objectContaining({ name: '最高限', type: 'line' }), expect.objectContaining({ name: 'PW201（p-1）', type: 'bar' })]),
    );
  });
});
