import { omit } from 'ramda';
import { describe, expect, it } from 'vitest';
import { MixpanelProvider } from './mixpanel';

describe('mixpanel', () => {
  it('should chunk date range into day chunks', async () => {
    const provider = new MixpanelProvider('pid', {
      from: '2025-01-01',
      to: '2025-01-04',
      serviceAccount: 'sa',
      serviceSecret: 'ss',
      projectId: '123',
      provider: 'mixpanel',
      type: 'api',
      mapScreenViewProperty: undefined,
    });

    const chunks = provider.getDateChunks('2025-01-01', '2025-01-04');
    expect(chunks).toEqual([
      ['2025-01-01', '2025-01-01'],
      ['2025-01-02', '2025-01-02'],
      ['2025-01-03', '2025-01-03'],
      ['2025-01-04', '2025-01-04'],
    ]);
  });

  it('should transform event', async () => {
    const provider = new MixpanelProvider('pid', {
      from: '2025-01-01',
      to: '2025-01-02',
      serviceAccount: 'sa',
      serviceSecret: 'ss',
      projectId: '123',
      provider: 'mixpanel',
      type: 'api',
      mapScreenViewProperty: undefined,
    });

    const rawEvent = {
      event: '$mp_web_page_view',
      properties: {
        time: 1746097970,
        distinct_id: '$device:123',
        $browser: 'Chrome',
        $browser_version: 135,
        $city: 'Mumbai',
        $current_url:
          'https://domain.com/state/maharashtra?utm_source=google&utm_medium=cpc&utm_campaignid=890&utm_adgroupid=&utm_adid=&utm_term=&utm_device=m&utm_network=x&utm_location=123&gclid=oqneoqow&gad_sour',
        $device: 'Android',
        $device_id: '123',
        $initial_referrer: 'https://referrer.com/',
        $initial_referring_domain: 'referrer.com',
        $insert_id: 'source_id',
        $lib_version: '2.60.0',
        $mp_api_endpoint: 'api-js.mixpanel.com',
        $mp_api_timestamp_ms: 1746078175363,
        $mp_autocapture: true,
        $os: 'Android',
        $referrer: 'https://google.com/',
        $referring_domain: 'referrer.com',
        $region: 'Maharashtra',
        $screen_height: 854,
        $screen_width: 384,
        current_domain: 'domain.com',
        current_page_title:
          'Landeed: Satbara Utara, 7/12 Extract, Property Card & Index 2',
        current_url_path: '/state/maharashtra',
        current_url_protocol: 'https:',
        current_url_search:
          '?utm_source=google&utm_medium=cpc&utm_campaignid=890&utm_adgroupid=&utm_adid=&utm_term=&utm_device=m&utm_network=x&utm_location=123&gclid=oqneoqow&gad_source=5&gclid=EAIaIQobChMI6MnvhciBjQMVlS-DAx',
        gclid: 'oqneoqow',
        mp_country_code: 'IN',
        mp_lib: 'web',
        mp_processing_time_ms: 1746078175546,
        mp_sent_by_lib_version: '2.60.0',
        utm_medium: 'cpc',
        utm_source: 'google',
      },
    };

    const res = provider.transformEvent(rawEvent);

    expect(res).toMatchObject({
      id: expect.any(String),
      name: 'screen_view',
      device_id: '123',
      profile_id: '123',
      project_id: 'pid',
      session_id: '',
      properties: {
        __source_insert_id: 'source_id',
        __screen: '384x854',
        __lib_version: '2.60.0',
        '__query.utm_source': 'google',
        '__query.utm_medium': 'cpc',
        '__query.utm_campaignid': '890',
        '__query.utm_device': 'm',
        '__query.utm_network': 'x',
        '__query.utm_location': '123',
        '__query.gclid': 'oqneoqow',
        __title:
          'Landeed: Satbara Utara, 7/12 Extract, Property Card & Index 2',
      },
      created_at: '2025-05-01T11:12:50.000Z',
      country: 'IN',
      city: 'Mumbai',
      region: 'Maharashtra',
      longitude: null,
      latitude: null,
      os: 'Android',
      os_version: undefined,
      browser: 'Chrome',
      browser_version: '',
      device: 'mobile',
      brand: '',
      model: '',
      duration: 0,
      path: '/state/maharashtra',
      origin: 'https://domain.com',
      referrer: 'https://referrer.com',
      referrer_name: 'Google',
      referrer_type: 'search',
      imported_at: expect.any(String),
      sdk_name: 'mixpanel (web)',
      sdk_version: '1.0.0',
    });
  });

  it('should parse stringified JSON in properties and flatten them', async () => {
    const provider = new MixpanelProvider('pid', {
      from: '2025-01-01',
      to: '2025-01-02',
      serviceAccount: 'sa',
      serviceSecret: 'ss',
      projectId: '123',
      provider: 'mixpanel',
      type: 'api',
      mapScreenViewProperty: undefined,
    });

    const rawEvent = {
      event: 'custom_event',
      properties: {
        time: 1746097970,
        distinct_id: '$device:123',
        $device_id: '123',
        $user_id: 'user123',
        mp_lib: 'web',
        // Stringified JSON object - should be parsed and flattened
        area: '{"displayText":"Malab, Nuh, Mewat","id":1189005}',
        // Stringified JSON array - should be parsed and flattened
        tags: '["tag1","tag2","tag3"]',
        // Regular string - should remain as is
        regularString: 'just a string',
        // Number - should be converted to string
        count: 42,
        // Object - should be flattened
        nested: { level1: { level2: 'value' } },
      },
    };

    const res = provider.transformEvent(rawEvent);

    expect(res.properties).toMatchObject({
      // Parsed JSON object should be flattened with dot notation
      'area.displayText': 'Malab, Nuh, Mewat',
      'area.id': '1189005',
      // Parsed JSON array should be flattened with numeric indices
      'tags.0': 'tag1',
      'tags.1': 'tag2',
      'tags.2': 'tag3',
      // Regular values
      regularString: 'just a string',
      count: '42',
      // Nested object flattened
      'nested.level1.level2': 'value',
    });
  });

  it('should handle react-native referrer', async () => {
    const provider = new MixpanelProvider('pid', {
      from: '2025-01-01',
      to: '2025-01-02',
      serviceAccount: 'sa',
      serviceSecret: 'ss',
      projectId: '123',
      provider: 'mixpanel',
      type: 'api',
      mapScreenViewProperty: undefined,
    });

    const rawEvent = {
      event: 'ec_search_error',
      properties: {
        time: 1759947367,
        distinct_id: '3385916',
        $browser: 'Mobile Safari',
        $browser_version: null,
        $city: 'Bengaluru',
        $current_url:
          'https://web.landeed.com/karnataka/ec-encumbrance-certificate',
        $device: 'iPhone',
        $device_id:
          '199b498af1036c-0e943279a1292e-5c0f4368-51bf4-199b498af1036c',
        $initial_referrer: 'https://www.google.com/',
        $initial_referring_domain: 'www.google.com',
        $insert_id: 'bclkaepeqcfuzt4v',
        $lib_version: '2.60.0',
        $mp_api_endpoint: 'api-js.mixpanel.com',
        $mp_api_timestamp_ms: 1759927570699,
        $os: 'iOS',
        $region: 'Karnataka',
        $screen_height: 852,
        $screen_width: 393,
        $search_engine: 'google',
        $user_id: '3385916',
        binaryReadableVersion: 'NA',
        binaryVersion: 'NA',
        component: '/karnataka/ec-encumbrance-certificate',
        errMsg: 'Request failed with status code 500',
        errType: 'SERVER_ERROR',
        isSilentSearch: false,
        isTimeout: false,
        jsVersion: '0.42.0',
        language: 'english',
        mp_country_code: 'IN',
        mp_lib: 'web',
        mp_processing_time_ms: 1759927592421,
        mp_sent_by_lib_version: '2.60.0',
        os: 'web',
        osVersion:
          'Mozilla/5.0 (iPhone; CPU iPhone OS 18_7_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1',
        phoneBrand: 'NA',
        phoneManufacturer: 'NA',
        phoneModel: 'NA',
        searchUuid: '68e65d08-fd81-4ded-37d3-2b08d2bc70c3',
        serverVersion: 'web2.0',
        state: 17,
        stateStr: '17',
        statusCode: 500,
        type: 'result_event',
        utm_medium: 'cpc',
        utm_source:
          'google%26utm_medium=cpc%26utm_campaignid=21380769590%26utm_adgroupid=%26utm_adid=%26utm_term=%26utm_device=m%26utm_network=%26utm_location=9062055%26gclid=%26gad_campaignid=21374496705%26gbraid=0AAAAAoV7mTM9mWFripzQ2Od0xXAfrW6p3%26wbraid=CmAKCQjwi4PHBhCUA',
      },
    };

    const res = provider.transformEvent(rawEvent);

    expect(res.id.length).toBeGreaterThan(30);
    expect(res.imported_at).toMatch(
      /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,
    );
    expect(omit(['id', 'imported_at'], res)).toEqual({
      brand: 'Apple',
      browser: 'GSA',
      browser_version: 'null',
      city: 'Bengaluru',
      country: 'IN',
      created_at: '2025-10-08T18:16:07.000Z',
      device: 'mobile',
      device_id: '199b498af1036c-0e943279a1292e-5c0f4368-51bf4-199b498af1036c',
      duration: 0,
      latitude: null,
      longitude: null,
      model: 'iPhone',
      name: 'ec_search_error',
      origin: 'https://web.landeed.com',
      os: 'iOS',
      os_version: '18.7.0',
      path: '/karnataka/ec-encumbrance-certificate',
      profile_id: '3385916',
      project_id: 'pid',
      properties: {
        __lib_version: '2.60.0',
        '__query.gad_campaignid': '21374496705',
        '__query.gbraid': '0AAAAAoV7mTM9mWFripzQ2Od0xXAfrW6p3',
        '__query.utm_campaignid': '21380769590',
        '__query.utm_device': 'm',
        '__query.utm_location': '9062055',
        '__query.utm_medium': 'cpc',
        '__query.utm_source': 'google',
        '__query.wbraid': 'CmAKCQjwi4PHBhCUA',
        __screen: '393x852',
        __source_insert_id: 'bclkaepeqcfuzt4v',
        __userAgent:
          'Mozilla/5.0 (iPhone; CPU iPhone OS 18_7_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1',
        binaryReadableVersion: 'NA',
        binaryVersion: 'NA',
        component: '/karnataka/ec-encumbrance-certificate',
        errMsg: 'Request failed with status code 500',
        errType: 'SERVER_ERROR',
        isSilentSearch: 'false',
        isTimeout: 'false',
        jsVersion: '0.42.0',
        language: 'english',
        os: 'web',
        osVersion:
          'Mozilla/5.0 (iPhone; CPU iPhone OS 18_7_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/388.0.811331708 Mobile/15E148 Safari/604.1',
        phoneBrand: 'NA',
        phoneManufacturer: 'NA',
        phoneModel: 'NA',
        searchUuid: '68e65d08-fd81-4ded-37d3-2b08d2bc70c3',
        serverVersion: 'web2.0',
        state: '17',
        stateStr: '17',
        statusCode: '500',
        type: 'result_event',
      },
      referrer: 'https://www.google.com',
      referrer_name: 'Google',
      referrer_type: 'search',
      region: 'Karnataka',
      sdk_name: 'mixpanel (web)',
      sdk_version: '1.0.0',
      session_id: '',
    });
  });
});
