"""Backend API tests for PT. KOMO PLAT INDONESIA - contact endpoints and health."""
import os
import pytest
import requests
from pathlib import Path
from dotenv import load_dotenv

load_dotenv(Path(__file__).parent.parent.parent / "frontend" / ".env")

BASE_URL = os.environ['REACT_APP_BACKEND_URL'].rstrip('/')
API = f"{BASE_URL}/api"


@pytest.fixture(scope="module")
def client():
    s = requests.Session()
    s.headers.update({"Content-Type": "application/json"})
    return s


# ---- Health ----
def test_root(client):
    r = client.get(f"{API}/")
    assert r.status_code == 200
    data = r.json()
    assert "message" in data
    assert "running" in data["message"].lower()


# ---- Contact POST ----
def test_create_contact_valid(client):
    payload = {
        "name": "TEST_John Doe",
        "email": "test_john@example.com",
        "phone": "+62-812-000-0001",
        "branch": "cabang1",
        "message": "TEST_This is an inquiry about Laser Cutting services."
    }
    r = client.post(f"{API}/contact", json=payload)
    assert r.status_code == 200, r.text
    data = r.json()
    assert data["name"] == payload["name"]
    assert data["email"] == payload["email"]
    assert data["phone"] == payload["phone"]
    assert data["branch"] == payload["branch"]
    assert data["message"] == payload["message"]
    assert "id" in data and isinstance(data["id"], str) and len(data["id"]) > 0
    assert "created_at" in data
    pytest.contact_id = data["id"]


def test_create_contact_invalid_email(client):
    payload = {
        "name": "TEST_Bad",
        "email": "not-an-email",
        "phone": "",
        "branch": "pusat",
        "message": "TEST_msg"
    }
    r = client.post(f"{API}/contact", json=payload)
    assert r.status_code == 422


def test_create_contact_missing_fields(client):
    r = client.post(f"{API}/contact", json={"email": "a@b.com"})
    assert r.status_code == 422


def test_create_contact_default_branch(client):
    payload = {
        "name": "TEST_Default",
        "email": "test_default@example.com",
        "message": "TEST_default branch"
    }
    r = client.post(f"{API}/contact", json=payload)
    assert r.status_code == 200, r.text
    data = r.json()
    assert data["branch"] == "pusat"


# ---- Contact GET ----
def test_list_contacts(client):
    r = client.get(f"{API}/contact")
    assert r.status_code == 200
    items = r.json()
    assert isinstance(items, list)
    assert len(items) >= 1
    # verify shape and no mongo _id
    first = items[0]
    assert "_id" not in first
    assert {"id", "name", "email", "message", "created_at", "branch"}.issubset(first.keys())

    # Verify our created record is present and results are sorted desc by created_at
    ids = [it["id"] for it in items]
    assert getattr(pytest, "contact_id", None) in ids
    # sort check
    times = [it["created_at"] for it in items]
    assert times == sorted(times, reverse=True)
