"""Tests for measure blueprint (client/blueprints/measure.py).

Covers recipe selection, task list, login requirement, and measurement submission.
"""
import pytest


class TestSelectRecipe:
    """GET /measure/select tests."""

    def test_select_recipe_renders(self, logged_in_client, mock_api_client, monkeypatch):
        """Recipe selection page renders for MeasurementTec role."""
        monkeypatch.setenv("STATION_CODE", "ST-TEST")
        import config
        import importlib
        importlib.reload(config)
        import blueprints.measure
        importlib.reload(blueprints.measure)

        mock_api_client.get_station_recipes.return_value = [
            {"id": 1, "code": "REC-001", "name": "Test Recipe"},
        ]

        resp = logged_in_client.get("/measure/select")
        assert resp.status_code == 200

    def test_select_recipe_requires_login(self, client):
        """Unauthenticated user is redirected to login."""
        resp = client.get("/measure/select", follow_redirects=False)
        assert resp.status_code == 302
        assert "/auth/login" in resp.headers["Location"]


class TestTaskList:
    """GET /measure/tasks/<recipe_id> tests."""

    def test_task_list_renders(self, logged_in_client, mock_api_client):
        """Task list page renders with recipe and task data."""
        # First call: recipe details (dict), second call: tasks list.
        # The route calls tasks_resp.get("error") so the mock must return
        # a dict (not a bare list) to avoid AttributeError.
        mock_api_client.get.side_effect = [
            {"id": 1, "code": "REC-001", "name": "Test Recipe"},
            {
                "items": [
                    {"id": 1, "title": "Task 1", "order_index": 0},
                    {"id": 2, "title": "Task 2", "order_index": 1},
                ],
            },
        ]

        resp = logged_in_client.get("/measure/tasks/1")
        assert resp.status_code == 200


class TestSaveMeasurement:
    """POST /measure/save-measurement tests."""

    def test_save_measurement_proxy(self, logged_in_client, mock_api_client):
        """Save measurement forwards data to API and returns 201."""
        mock_api_client.post.return_value = {
            "id": 1,
            "subtask_id": 10,
            "version_id": 3,
            "value": 9.95,
            "pass_fail": "pass",
        }

        resp = logged_in_client.post(
            "/measure/save-measurement",
            json={
                "subtask_id": 10,
                "version_id": 3,
                "value": 9.95,
            },
            content_type="application/json",
        )
        assert resp.status_code == 201
        data = resp.get_json()
        assert data["id"] == 1
        assert data["pass_fail"] == "pass"

    def test_save_measurement_missing_fields(self, logged_in_client, mock_api_client):
        """Missing required fields return 400."""
        resp = logged_in_client.post(
            "/measure/save-measurement",
            json={"subtask_id": 10},  # missing version_id and value
            content_type="application/json",
        )
        assert resp.status_code == 400
        data = resp.get_json()
        assert data["error"] is True
