"""Tests for the per-PC default-printer endpoint (/api/printers/pc-default).

Parity with classic apipcdefaultprinter.asp: the signed printer-installer EXE
preselects a PC's default printer by machine (asset) number. The link is a
`defaultprinter` asset relationship (PC asset -> printer asset).
"""

import pytest

from shopdb.core.models import Asset, AssetType, AssetRelationship, RelationshipType
from plugins.printers.models import Printer


@pytest.fixture
def scene(db):
    """A PC asset, a printer asset, and the defaultprinter relationship type."""
    pc_type = AssetType(assettype='computer', pluginname='computers', tablename='computers')
    pr_type = AssetType(assettype='printer', pluginname='printers', tablename='printers')
    dp_type = RelationshipType(relationshiptype='defaultprinter', description='PC to default printer')
    db.session.add_all([pc_type, pr_type, dp_type])
    db.session.flush()

    pc = Asset(assetnumber='3210', name='CSF04 PC', assettypeid=pc_type.assettypeid, isactive=True)
    pr_asset = Asset(assetnumber='PRN-01', name='Materials HP', assettypeid=pr_type.assettypeid, isactive=True)
    db.session.add_all([pc, pr_asset])
    db.session.flush()

    printer = Printer(assetid=pr_asset.assetid, windowsname='HP-CSF04-Materials')
    db.session.add(printer)
    db.session.commit()

    return {'pc': pc, 'printer_asset': pr_asset, 'printer': printer, 'dp_type': dp_type}


def _link_default(db, pc, printer_asset, dp_type):
    db.session.add(AssetRelationship(
        sourceassetid=pc.assetid,
        targetassetid=printer_asset.assetid,
        relationshiptypeid=dp_type.relationshiptypeid,
    ))
    db.session.commit()


def test_returns_default_printer_for_pc(client, db, scene):
    _link_default(db, scene['pc'], scene['printer_asset'], scene['dp_type'])

    resp = client.get('/api/printers/pc-default?machine=3210')
    assert resp.status_code == 200
    data = resp.get_json()['data']
    assert data['printerid'] == scene['printer'].printerid
    assert data['windowsname'] == 'HP-CSF04-Materials'


def test_pc_without_default_returns_empty(client, db, scene):
    resp = client.get('/api/printers/pc-default?machine=3210')
    assert resp.status_code == 200
    assert resp.get_json()['data'] == {}


def test_unknown_machine_returns_empty(client, db, scene):
    resp = client.get('/api/printers/pc-default?machine=NOPE')
    assert resp.status_code == 200
    assert resp.get_json()['data'] == {}


def test_missing_machine_param_returns_empty(client, db, scene):
    resp = client.get('/api/printers/pc-default')
    assert resp.status_code == 200
    assert resp.get_json()['data'] == {}
