"""
Tests for daily reconciliation: financial integrity, locking, variance calculation.
"""
import json, pytest


class TestReconciliation:
    def test_reconciliation_requires_outlet_id(self, gm_client):
        r = gm_client.get('/api/reconciliation')
        assert r.status_code == 400
        assert 'outlet_id' in json.loads(r.data).get('error', '')

    def test_reconciliation_returns_structure(self, gm_client):
        r = gm_client.get('/api/reconciliation?outlet_id=1')
        assert r.status_code == 200
        data = json.loads(r.data)
        for key in ('opening_stock', 'received_stock', 'remaining_stock',
                    'expected_sold', 'cash_declared', 'mpesa_total',
                    'total_collected', 'variance'):
            assert key in data, f"Missing key: {key}"

    def test_reconciliation_values_are_numeric(self, gm_client):
        r = gm_client.get('/api/reconciliation?outlet_id=1')
        data = json.loads(r.data)
        for key in ('opening_stock', 'variance', 'total_collected'):
            assert isinstance(data[key], (int, float)), f"{key} not numeric"

    def test_locked_reconciliation_cannot_be_overwritten(self, gm_client):
        """Once locked, a reconciliation for the same date/outlet must reject re-lock."""
        # First lock
        r1 = gm_client.post('/api/reconciliation?outlet_id=1',
                             data=json.dumps({'notes': 'first lock'}),
                             content_type='application/json',
                             headers={'X-CSRFToken': 'test-csrf-token'})
        assert r1.status_code == 200
        # Second lock attempt on same day
        r2 = gm_client.post('/api/reconciliation?outlet_id=1',
                             data=json.dumps({'notes': 'second lock attempt'}),
                             content_type='application/json',
                             headers={'X-CSRFToken': 'test-csrf-token'})
        assert r2.status_code == 400
        assert 'locked' in json.loads(r2.data).get('error', '').lower()
