"""Tests for per-asset-type optional identifiers (gauge/maintenance refs).

Pins two behaviors that shipped without coverage:
1. gaugelabreference + maintenancereference round-trip through each plugin's
   asset create AND update endpoints (computer, printer, network).
2. The per-type identifier seed produces one setting per
   (identifier x asset type) pair.
"""

import pytest

from shopdb.core.api.settings import IDENTIFIER_LABELS, IDENTIFIER_ASSETTYPES


@pytest.fixture
def asset_types(db):
    """Seed the asset types the create endpoints look up by name."""
    from shopdb.core.models import AssetType

    for name in ('computer', 'printer', 'network_device'):
        db.session.add(AssetType(assettype=name, pluginname=name,
                                 tablename=name, description=name))
    db.session.commit()


# (endpoint prefix, extension key in the response, extra create fields)
PLUGIN_CASES = [
    ('/api/computers', 'computer', {}),
    ('/api/printers', 'printer', {}),
    ('/api/network', 'networkdevice', {}),
]


@pytest.mark.parametrize('prefix,extkey,extra', PLUGIN_CASES)
def test_gauge_maintenance_roundtrip(client, db, auth_headers, asset_types,
                                     prefix, extkey, extra):
    """Gauge/maintenance refs persist on create and update for each type."""
    payload = {
        'assetnumber': f'AST-{extkey}',
        'gaugelabreference': 'GL-1',
        'maintenancereference': 'MNT-1',
        **extra,
    }
    created = client.post(prefix, json=payload, headers=auth_headers)
    assert created.status_code == 201, created.get_json()
    body = created.get_json()['data']
    assert body['gaugelabreference'] == 'GL-1'
    assert body['maintenancereference'] == 'MNT-1'

    extid = body[extkey][f'{extkey}id'] if extkey != 'networkdevice' \
        else body[extkey]['networkdeviceid']

    updated = client.put(f'{prefix}/{extid}',
                         json={'gaugelabreference': 'GL-2',
                               'maintenancereference': 'MNT-2'},
                         headers=auth_headers)
    assert updated.status_code == 200, updated.get_json()

    fetched = client.get(f'{prefix}/{extid}', headers=auth_headers).get_json()['data']
    assert fetched['gaugelabreference'] == 'GL-2'
    assert fetched['maintenancereference'] == 'MNT-2'


def test_per_type_identifier_seed_count(client, db, auth_headers):
    """Seeding produces one boolean setting per identifier x asset type."""
    response = client.post('/api/settings/seed', headers=auth_headers)
    assert response.status_code == 200

    from shopdb.core.models import Setting
    keys = {s.key for s in Setting.query.filter_by(category='identifiers').all()}
    expected = {
        f'identifier_{name}_{assettype}_enabled'
        for name in IDENTIFIER_LABELS
        for assettype in IDENTIFIER_ASSETTYPES
    }
    assert expected <= keys
    assert len(expected) == len(IDENTIFIER_LABELS) * len(IDENTIFIER_ASSETTYPES)
