from __future__ import annotations

from fastapi.testclient import TestClient

from models.project import MiningOperationType, Project


def test_project_import_preview_and_commit_flow(
    client: TestClient,
    unit_of_work_factory,
) -> None:
    with unit_of_work_factory() as uow:
        assert uow.projects is not None
        existing = Project(
            name="Existing Project",
            location="Chile",
            operation_type=MiningOperationType.OPEN_PIT,
        )
        uow.projects.create(existing)

    csv_content = (
        "name,location,operation_type\n"
        "Existing Project,Peru,underground\n"
        "New Project,Canada,open pit\n"
    )

    preview_response = client.post(
        "/imports/projects/preview",
        files={"file": ("projects.csv", csv_content, "text/csv")},
    )
    assert preview_response.status_code == 200
    preview_data = preview_response.json()
    assert preview_data["summary"]["accepted"] == 2
    token = preview_data["stage_token"]
    assert token

    commit_response = client.post(
        "/imports/projects/commit",
        json={"token": token},
    )
    assert commit_response.status_code == 200
    commit_data = commit_response.json()
    assert commit_data["summary"] == {"created": 1, "updated": 1}

    with unit_of_work_factory() as uow:
        assert uow.projects is not None
        projects = {project.name: project for project in uow.projects.list()}
        assert "Existing Project" in projects and "New Project" in projects
        assert (
            projects["Existing Project"].operation_type
            == MiningOperationType.UNDERGROUND
        )

    repeat_commit = client.post(
        "/imports/projects/commit",
        json={"token": token},
    )
    assert repeat_commit.status_code == 404


def test_scenario_import_commit_invalid_token_returns_404(
    client: TestClient,
) -> None:
    response = client.post(
        "/imports/scenarios/commit",
        json={"token": "missing-token"},
    )
    assert response.status_code == 404
    assert "Unknown scenario import token" in response.json()["detail"]


def test_scenario_import_preview_rejects_invalid_currency(
    client: TestClient,
    unit_of_work_factory,
) -> None:
    with unit_of_work_factory() as uow:
        assert uow.projects is not None
        project = Project(
            name="Import Currency Project",
            operation_type=MiningOperationType.OPEN_PIT,
        )
        uow.projects.create(project)

    csv_content = (
        "project_name,name,currency\n"
        "Import Currency Project,Invalid Currency,US\n"
    )

    response = client.post(
        "/imports/scenarios/preview",
        files={"file": ("scenarios.csv", csv_content, "text/csv")},
    )

    assert response.status_code == 200
    payload = response.json()
    assert payload["summary"]["accepted"] == 0
    assert payload["summary"]["errored"] == 1
    assert payload["parser_errors"]
    parser_error = payload["parser_errors"][0]
    assert parser_error["field"] == "currency"
    assert "Invalid currency code" in parser_error["message"]
