# utils/date_converter.py
from datetime import datetime, date
from typing import Optional

class DateConverter:
    """
    日本語の日付文字列を扱うユーティリティクラス
    """
    
    def convert_date(self, date_str: str) -> Optional[date]:
        """
        日本語の日付文字列をdateオブジェクトに変換する
        
        Args:
            date_str: 変換する日付文字列（例: '1990年1月1日' or '1990-01-01' or '1990/01/01'）
            
        Returns:
            変換されたdateオブジェクト。変換できない場合はNone
        """
        if not date_str or date_str.strip() == '':
            return None
            
        try:
            # 全角数字を半角数字に変換
            date_str = date_str.translate(
                str.maketrans('０１２３４５６７８９', '0123456789')
            )
            date_str = date_str.strip()

            # 区切り文字の判定と分割
            if '年' in date_str:
                # 年月日形式の場合
                date_parts = date_str.replace('年', '/').replace('月', '/').replace('日', '').split('/')
            elif '/' in date_str:
                # スラッシュ区切りの場合
                date_parts = date_str.split('/')
            elif '-' in date_str:
                # ハイフン区切りの場合
                date_parts = date_str.split('-')
            else:
                return None
    
            # 部分の数を確認
            if len(date_parts) != 3:
                return None
    
            year = int(date_parts[0])
            month = int(date_parts[1])
            day = int(date_parts[2])
            
            # 簡単な妥当性チェック
            if not (1900 <= year <= 2100):
                return None
            if not (1 <= month <= 12):
                return None
            if not (1 <= day <= 31):
                return None

            return date(year, month, day)
            
        except (ValueError, IndexError, TypeError):
            return None

    def format_date(self, d: date, format_type: str = 'ja') -> str:
        """
        dateオブジェクトを指定された形式の文字列に変換する
        
        Args:
            d: 変換するdateオブジェクト
            format_type: 出力形式 ('ja': 日本語形式, 'iso': ISO形式)
            
        Returns:
            変換された日付文字列
        """
        if not isinstance(d, date):
            return ''
            
        if format_type == 'ja':
            return f"{d.year}年{d.month}月{d.day}日"
        elif format_type == 'iso':
            return d.isoformat()
        else:
            return str(d)