"""Tests for the shopfloor TV feed (/api/notifications/shopfloor).

Recognition AND training notifications that name several comma-joined SSOs fan
out into one card per employee; every other type stays a single card. Mirrors
classic apishopfloor.asp, which splits both types.
"""

import pytest

from plugins.notifications.models import Notification, NotificationType


def _make_type(db, typename, typecolor):
    t = NotificationType(typename=typename, typecolor=typecolor, isactive=True)
    db.session.add(t)
    db.session.commit()
    return t


def _make_shopfloor_note(db, ntype, employeesso, employeename):
    n = Notification(
        notificationtypeid=ntype.notificationtypeid,
        notification='msg',
        businessunitid=None,
        isactive=True,
        isshopfloor=True,
        employeesso=employeesso,
        employeename=employeename,
    )
    db.session.add(n)
    db.session.commit()
    return n


@pytest.mark.parametrize('typecolor', ['recognition', 'training'])
def test_multi_employee_split_into_one_card_each(client, db, typecolor):
    """A recognition/training note with two SSOs yields two current cards."""
    ntype = _make_type(db, typecolor.capitalize(), typecolor)
    _make_shopfloor_note(db, ntype, '111,222', 'Alice, Bob')

    resp = client.get('/api/notifications/shopfloor')
    assert resp.status_code == 200
    current = resp.get_json()['data']['current']
    assert len(current) == 2
    assert {c['employeesso'] for c in current} == {'111', '222'}
    assert {c['employeename'] for c in current} == {'Alice', 'Bob'}


def test_non_split_type_stays_single_card(client, db):
    """A non recognition/training type is not fanned out, even with many SSOs."""
    ntype = _make_type(db, 'Awareness', 'info')
    _make_shopfloor_note(db, ntype, '111,222', 'Alice, Bob')

    resp = client.get('/api/notifications/shopfloor')
    assert resp.status_code == 200
    current = resp.get_json()['data']['current']
    assert len(current) == 1
    assert current[0]['employeesso'] == '111,222'


def test_single_employee_recognition_stays_single_card(client, db):
    """One SSO produces one card (no spurious split on a lone employee)."""
    ntype = _make_type(db, 'Recognition', 'recognition')
    _make_shopfloor_note(db, ntype, '111', 'Alice')

    resp = client.get('/api/notifications/shopfloor')
    assert resp.status_code == 200
    current = resp.get_json()['data']['current']
    assert len(current) == 1
    assert current[0]['employeesso'] == '111'
