"""项目初始化器 - 测试初始化功能"""

import os
import sys
import json
from pathlib import Path
from datetime import datetime


class ProjectInitializer:
    """项目初始化器，负责创建基础项目结构"""

    def __init__(self, project_name: str, base_path: str = "."):
        self.project_name = project_name
        self.base_path = Path(base_path)
        self.structure = {
            "src": ["__init__.py", "main.py"],
            "tests": ["__init__.py", "test_main.py"],
            "docs": ["README.md"],
            "config": ["settings.json"],
        }
        self.created_dirs = []
        self.created_files = []

    def initialize(self) -> dict:
        """执行初始化，返回结果报告"""
        result = {
            "project": self.project_name,
            "base_path": str(self.base_path.absolute()),
            "started_at": datetime.now().isoformat(),
            "dirs_created": 0,
            "files_created": 0,
            "errors": [],
        }

        for dir_name, files in self.structure.items():
            dir_path = self.base_path / dir_name
            try:
                dir_path.mkdir(parents=True, exist_ok=True)
                self.created_dirs.append(str(dir_path))
                result["dirs_created"] += 1
            except OSError as e:
                result["errors"].append(f"创建目录 {dir_name} 失败: {e}")
                continue

            for file_name in files:
                file_path = dir_path / file_name
                if not file_path.exists():
                    try:
                        file_path.touch()
                        self.created_files.append(str(file_path))
                        result["files_created"] += 1
                    except OSError as e:
                        result["errors"].append(f"创建文件 {file_name} 失败: {e}")

        result["completed_at"] = datetime.now().isoformat()
        result["success"] = len(result["errors"]) == 0

        # 写入初始化报告
        report_path = self.base_path / "init_report.json"
        with open(report_path, "w", encoding="utf-8") as f:
            json.dump(result, f, ensure_ascii=False, indent=2)
        self.created_files.append(str(report_path))
        result["report_path"] = str(report_path)

        return result


def main():
    """CLI入口"""
    project_name = sys.argv[1] if len(sys.argv) > 1 else "test-project"
    base_path = sys.argv[2] if len(sys.argv) > 2 else "."

    init = ProjectInitializer(project_name, base_path)
    result = init.initialize()

    if result["success"]:
        print(f"【测试初始化】项目 '{project_name}' 初始化成功")
        print(f"  目录: {result['base_path']}")
        print(f"  创建目录: {result['dirs_created']} 个")
        print(f"  创建文件: {result['files_created']} 个")
    else:
        print(f"【测试初始化】初始化完成，但有 {len(result['errors'])} 个错误")
        for err in result["errors"]:
            print(f"  ✗ {err}")

    print(f"  报告已保存: {result.get('report_path', 'N/A')}")
    return 0 if result["success"] else 1


if __name__ == "__main__":
    sys.exit(main())
