"""
給与所得の源泉徴収票 スキーマ定義
"""
from pydantic import BaseModel
from typing import Optional, List
from decimal import Decimal


class DependentInfo(BaseModel):
    """扶養親族情報"""
    name: str
    name_kana: Optional[str] = None
    relationship: Optional[str] = None
    birth_date: Optional[str] = None
    is_spouse: bool = False
    is_disabled: bool = False
    income_amount: Decimal = Decimal("0")
    my_number: Optional[str] = None
    deduction_type: Optional[str] = None  # 一般/特定/老人(同居)/老人(その他)
    deduction_amount: Decimal = Decimal("0")


class WithholdingSlipData(BaseModel):
    """源泉徴収票データ"""
    # 従業員情報
    employee_id: int
    employee_code: str
    employee_name: str
    employee_name_kana: Optional[str] = None
    employee_address: Optional[str] = None
    employee_birth_date: Optional[str] = None
    my_number: Optional[str] = None

    # 対象年
    tax_year: int

    # 支払金額
    total_payment: Decimal = Decimal("0")           # 年間総支給額（通勤手当含む）
    total_payment_excl_commute: Decimal = Decimal("0")  # 通勤手当を除く支払金額（源泉徴収票記載用）

    # 給与所得控除後の金額
    kyuyo_shotoku: Decimal = Decimal("0")

    # 社会保険料等の金額
    social_insurance_total: Decimal = Decimal("0")
    health_insurance_total: Decimal = Decimal("0")
    care_insurance_total: Decimal = Decimal("0")
    pension_total: Decimal = Decimal("0")
    employment_insurance_total: Decimal = Decimal("0")

    # 基礎控除
    basic_deduction: Decimal = Decimal("0")

    # 配偶者控除
    has_spouse_deduction: bool = False
    spouse_deduction_amount: Decimal = Decimal("0")
    spouse_name: Optional[str] = None
    spouse_name_kana: Optional[str] = None
    spouse_income: Decimal = Decimal("0")
    spouse_deduction_type: Optional[str] = None  # 配偶者控除/配偶者特別控除

    # 扶養親族
    dependents_over16: List[DependentInfo] = []    # 16歳以上控除対象扶養親族
    dependents_under16: List[DependentInfo] = []   # 16歳未満扶養親族
    dependent_deduction_total: Decimal = Decimal("0")

    # 所得控除の額の合計額
    total_deduction_amount: Decimal = Decimal("0")

    # 源泉徴収税額
    income_tax_withheld: Decimal = Decimal("0")

    # 月数内訳
    months_with_salary: int = 0
    months_with_bonus: int = 0

    # 摘要
    remarks: Optional[str] = None


class WithholdingSlipRequest(BaseModel):
    """源泉徴収票生成リクエスト"""
    tax_year: int
    employee_ids: List[int]
    company_name: Optional[str] = None
    company_address: Optional[str] = None
    company_phone: Optional[str] = None
    company_my_number: Optional[str] = None


class WithholdingSlipResponse(BaseModel):
    """源泉徴収票レスポンス"""
    tax_year: int
    slips: List[WithholdingSlipData]
    total_count: int
