"""企业信息模型：映射源库 Base_Customer_Company。"""
from __future__ import annotations

from datetime import datetime

from sqlalchemy import DateTime, Integer, String
from sqlalchemy.orm import Mapped, mapped_column

from app.models.base import SourceBase


class EnterpriseInfo(SourceBase):
    """企业信息：映射到源库（vat_db）的 Base_Customer_Company 表。

    Python 属性名保持原样（id/name_cn/...），通过 mapped_column("列名") 指向真实列，
    使上层查询、to_template_values() 与测试种子数据无需改动。
    """

    __tablename__ = "Base_Customer_Company"

    id: Mapped[int] = mapped_column("CompanyID", Integer, primary_key=True, autoincrement=True)
    name_cn: Mapped[str | None] = mapped_column("NameCN", String(1000), nullable=True)
    name_en: Mapped[str | None] = mapped_column("NameEng", String(1000), nullable=True)
    address: Mapped[str | None] = mapped_column("RegAddressEng", String(1000), nullable=True)
    postal_code: Mapped[str | None] = mapped_column("CompanyAddressPostcode", String(100), nullable=True)
    country_code: Mapped[str | None] = mapped_column("Country", String(100), nullable=True)
    legal_representative: Mapped[str | None] = mapped_column("LegalPersonName", String(500), nullable=True)
    created_at: Mapped[datetime | None] = mapped_column("CreationDate", DateTime, nullable=True)

    def to_template_values(self) -> dict[str, str]:
        return {
            "公司英文名": self.name_en or "",
            "地址": self.address or "",          # RegAddressEng（英文地址）
            "邮编": self.postal_code or "",
            "国家代码": "CN",                     # 模板要求 ISO 代码，表中无独立代码列
            "法人名": self.legal_representative or "",
        }

    def to_dict(self) -> dict:
        return {
            "id": self.id,
            "name_cn": self.name_cn,
            "name_en": self.name_en,
            "address": self.address,
            "postal_code": self.postal_code,
            "country_code": self.country_code,
            "legal_representative": self.legal_representative,
            "created_at": self.created_at.isoformat() if self.created_at else None,
        }
