"""Unit tests for db.py helper functions and app.py utilities."""
import sys
import os

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import db


class TestHashEmail:
    def test_basic(self):
        h = db.hash_email("test@example.com")
        assert len(h) == 64
        assert h == db.hash_email("test@example.com")

    def test_case_insensitive(self):
        assert db.hash_email("Test@Example.COM") == db.hash_email("test@example.com")

    def test_trims_whitespace(self):
        assert db.hash_email("  test@example.com  ") == db.hash_email("test@example.com")


class TestGenerateAccessToken:
    def test_length(self):
        token = db.generate_access_token()
        assert len(token) == 16

    def test_digits_only(self):
        token = db.generate_access_token()
        assert token.isdigit()


class TestAgeToRange:
    def test_under_18(self):
        assert db.age_to_range(16) == "15-17"

    def test_young_adult(self):
        assert db.age_to_range(22) == "18-24"

    def test_adult(self):
        assert db.age_to_range(30) == "25-34"

    def test_middle(self):
        assert db.age_to_range(45) == "35-50"

    def test_senior(self):
        assert db.age_to_range(60) == "50+"

    def test_boundary_18(self):
        assert db.age_to_range(18) == "18-24"

    def test_boundary_24(self):
        assert db.age_to_range(24) == "18-24"

    def test_boundary_50(self):
        assert db.age_to_range(50) == "35-50"


class TestMapPastAttempts:
    def test_none(self):
        assert db.map_past_attempts(None) == "Never"

    def test_zero(self):
        assert db.map_past_attempts(0) == "Never"

    def test_one(self):
        assert db.map_past_attempts(1) == "1-2 times"

    def test_three(self):
        assert db.map_past_attempts(3) == "3-5 times"

    def test_seven(self):
        assert db.map_past_attempts(7) == "4-10 times"

    def test_many(self):
        assert db.map_past_attempts(15) == "Lost count"


class TestMapTimeAfterWake:
    def test_none(self):
        assert db.map_time_after_wake(None) is None

    def test_within_5(self):
        assert db.map_time_after_wake(3) == "within-5"

    def test_within_30(self):
        assert db.map_time_after_wake(15) == "within-30"

    def test_within_60(self):
        assert db.map_time_after_wake(45) == "within-60"

    def test_after_breakfast(self):
        assert db.map_time_after_wake(90) == "after-breakfast"

    def test_later(self):
        assert db.map_time_after_wake(180) == "later"


class TestMapCurrencyToCode:
    def test_inr(self):
        assert db.map_currency_to_code("₹") == "INR"

    def test_usd(self):
        assert db.map_currency_to_code("$") == "USD"

    def test_unknown_passthrough(self):
        assert db.map_currency_to_code("XYZ") == "XYZ"


class TestCountryCodeToName:
    def test_india(self):
        assert db.country_code_to_name("IN") == "India"

    def test_lowercase(self):
        assert db.country_code_to_name("us") == "United States"

    def test_none(self):
        assert db.country_code_to_name(None) is None

    def test_unknown(self):
        assert db.country_code_to_name("ZZ") == "ZZ"


class TestToV3Csv:
    def test_empty(self):
        assert db.to_v3_csv([], {}) is None

    def test_none(self):
        assert db.to_v3_csv(None, {}) is None

    def test_mapped(self):
        result = db.to_v3_csv(["morning", "coffee"], db.TRIGGER_LABELS)
        assert result == "First thing in the morning,With coffee/tea"

    def test_dedup(self):
        result = db.to_v3_csv(["stress", "chain"], db.TRIGGER_LABELS)
        assert result == "Other"

    def test_unmapped_becomes_other(self):
        result = db.to_v3_csv(["unknown_value"], db.TRIGGER_LABELS)
        assert result == "Other"


class TestGenerateVeUserId:
    def test_format(self):
        result = db.generate_ve_user_id(12345)
        assert "-" in result
        assert result.endswith("45")

    def test_small_id(self):
        result = db.generate_ve_user_id(5)
        assert result.endswith("5")
