#!/usr/bin/env python3
"""
시스템 관리자 계정 생성 스크립트
최초 설치 시 시스템 관리자 계정을 생성합니다.
"""

import sys
import os
import getpass
from datetime import datetime

# 프로젝트 루트를 Python 경로에 추가
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
from app.config import get_settings
from app.auth.models import User, UserRepository
from app.database import Base

def create_system_admin():
    """시스템 관리자 계정 생성"""
    
    print("=" * 60)
    print("🔧 TK-MP 시스템 관리자 계정 생성")
    print("=" * 60)
    
    # 설정 로드
    settings = get_settings()
    
    # 데이터베이스 연결
    try:
        engine = create_engine(settings.get_database_url())
        SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
        db = SessionLocal()
        
        print("✅ 데이터베이스 연결 성공")
        
        # 테이블 생성 (필요한 경우)
        Base.metadata.create_all(bind=engine)
        print("✅ 데이터베이스 테이블 확인/생성 완료")
        
    except Exception as e:
        print(f"❌ 데이터베이스 연결 실패: {str(e)}")
        return False
    
    # 기존 시스템 관리자 확인
    try:
        user_repo = UserRepository(db)
        existing_admin = db.query(User).filter(User.role == 'system').first()
        
        if existing_admin:
            print(f"⚠️  시스템 관리자가 이미 존재합니다: {existing_admin.username}")
            response = input("새로운 시스템 관리자를 추가로 생성하시겠습니까? (y/N): ").lower()
            if response != 'y':
                print("❌ 작업이 취소되었습니다.")
                return False
        
    except Exception as e:
        print(f"❌ 기존 관리자 확인 실패: {str(e)}")
        return False
    
    # 사용자 입력 받기
    print("\n📝 시스템 관리자 정보를 입력해주세요:")
    print("-" * 40)
    
    try:
        # 사용자명 입력
        while True:
            username = input("사용자명 (영문/숫자, 3-20자): ").strip()
            if not username:
                print("❌ 사용자명을 입력해주세요.")
                continue
            if len(username) < 3 or len(username) > 20:
                print("❌ 사용자명은 3-20자여야 합니다.")
                continue
            if not username.replace('_', '').isalnum():
                print("❌ 사용자명은 영문, 숫자, 언더스코어만 사용 가능합니다.")
                continue
            
            # 중복 확인
            existing_user = user_repo.find_by_username(username)
            if existing_user:
                print("❌ 이미 존재하는 사용자명입니다.")
                continue
            
            break
        
        # 이름 입력
        while True:
            name = input("이름 (한글/영문, 2-50자): ").strip()
            if not name:
                print("❌ 이름을 입력해주세요.")
                continue
            if len(name) < 2 or len(name) > 50:
                print("❌ 이름은 2-50자여야 합니다.")
                continue
            break
        
        # 이메일 입력 (선택사항)
        email = input("이메일 (선택사항): ").strip()
        if email and '@' not in email:
            print("⚠️  올바르지 않은 이메일 형식입니다. 빈 값으로 설정합니다.")
            email = None
        
        # 비밀번호 입력
        while True:
            password = getpass.getpass("비밀번호 (8자 이상): ")
            if len(password) < 8:
                print("❌ 비밀번호는 8자 이상이어야 합니다.")
                continue
            
            password_confirm = getpass.getpass("비밀번호 확인: ")
            if password != password_confirm:
                print("❌ 비밀번호가 일치하지 않습니다.")
                continue
            
            break
        
        # 부서/직책 입력 (선택사항)
        department = input("부서 (선택사항): ").strip() or None
        position = input("직책 (선택사항): ").strip() or None
        
    except KeyboardInterrupt:
        print("\n❌ 작업이 취소되었습니다.")
        return False
    
    # 입력 정보 확인
    print("\n📋 입력된 정보:")
    print("-" * 40)
    print(f"사용자명: {username}")
    print(f"이름: {name}")
    print(f"이메일: {email or '(없음)'}")
    print(f"부서: {department or '(없음)'}")
    print(f"직책: {position or '(없음)'}")
    print(f"역할: 시스템 관리자")
    
    response = input("\n위 정보로 시스템 관리자를 생성하시겠습니까? (y/N): ").lower()
    if response != 'y':
        print("❌ 작업이 취소되었습니다.")
        return False
    
    # 사용자 생성
    try:
        # 사용자 객체 생성
        user = User(
            username=username,
            name=name,
            email=email,
            role='system',
            access_level='system',
            department=department,
            position=position,
            is_active=True
        )
        
        # 비밀번호 설정
        user.set_password(password)
        
        # 데이터베이스에 저장
        db.add(user)
        db.commit()
        db.refresh(user)
        
        print(f"✅ 시스템 관리자 계정이 생성되었습니다!")
        print(f"   - 사용자 ID: {user.user_id}")
        print(f"   - 사용자명: {user.username}")
        print(f"   - 이름: {user.name}")
        print(f"   - 생성일시: {user.created_at}")
        
        return True
        
    except Exception as e:
        db.rollback()
        print(f"❌ 사용자 생성 실패: {str(e)}")
        return False
    
    finally:
        db.close()

def main():
    """메인 함수"""
    try:
        success = create_system_admin()
        if success:
            print("\n🎉 시스템 관리자 계정 생성이 완료되었습니다!")
            print("이제 이 계정으로 로그인하여 다른 사용자를 관리할 수 있습니다.")
        else:
            print("\n❌ 시스템 관리자 계정 생성에 실패했습니다.")
            sys.exit(1)
            
    except Exception as e:
        print(f"\n💥 예상치 못한 오류가 발생했습니다: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()
