import ast
import unittest
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]


def source(path: str) -> str:
    return (ROOT / path).read_text(encoding="utf-8")


def class_names(path: str) -> set[str]:
    parsed = ast.parse(source(path))
    return {node.name for node in ast.walk(parsed) if isinstance(node, ast.ClassDef)}


class FinanceCenterModelTests(unittest.TestCase):
    def test_models_define_finance_entities(self) -> None:
        models = source("app/core/models.py")
        names = class_names("app/core/models.py")

        for expected in [
            "Expense",
            "ReceiptAsset",
            "Employee",
            "PayrollRecord",
            "GstSetting",
        ]:
            self.assertIn(expected, names)

        self.assertIn('ird_number = Column(String(100))', models)
        self.assertIn('cycle_months = Column(Integer, nullable=False)', models)
        self.assertIn('source = Column(String(50), default="manual")', models)
        self.assertIn('status = Column(String(30), default="draft")', models)
        self.assertIn('receipt_asset_id = Column(Integer, ForeignKey("receipt_assets.id"', models)

    def test_init_sql_creates_finance_tables(self) -> None:
        sql = source("init_db.sql")

        self.assertIn("CREATE TABLE IF NOT EXISTS expenses", sql)
        self.assertIn("CREATE TABLE IF NOT EXISTS receipt_assets", sql)
        self.assertIn("CREATE TABLE IF NOT EXISTS employees", sql)
        self.assertIn("CREATE TABLE IF NOT EXISTS payroll_records", sql)
        self.assertIn("CREATE TABLE IF NOT EXISTS gst_settings", sql)

    def test_migration_file_contains_finance_tables(self) -> None:
        migration = source("migrations/2026-05-31-finance-center.sql")

        self.assertIn("CREATE TABLE IF NOT EXISTS receipt_assets", migration)
        self.assertIn("CREATE TABLE IF NOT EXISTS expenses", migration)
        self.assertIn("CREATE TABLE IF NOT EXISTS employees", migration)
        self.assertIn("CREATE TABLE IF NOT EXISTS payroll_records", migration)
        self.assertIn("CREATE TABLE IF NOT EXISTS gst_settings", migration)


if __name__ == "__main__":
    unittest.main()
