"""
관리자 계정 설정 스크립트
특정 사용자를 관리자로 설정하거나 관리자 계정을 생성합니다.
"""
import sys
import os
from dotenv import load_dotenv
import psycopg2
from werkzeug.security import generate_password_hash

# 환경변수 로딩
load_dotenv()

# 프로젝트 루트 경로 추가
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

def get_db_connection():
    """데이터베이스 연결"""
    DB_CONFIG = {
        'dbname': os.getenv('DB_NAME', 'bridge_db'),
        'user': os.getenv('DB_USER', 'postgres'),
        'password': os.getenv('DB_PASSWORD', 'Maruta82'),
        'host': os.getenv('DB_HOST', 'infrasmart.co.kr'),
        'port': os.getenv('DB_PORT', '5433')
    }
    return psycopg2.connect(**DB_CONFIG)

def set_admin_by_email(email):
    """이메일로 사용자를 관리자로 설정"""
    conn = None
    try:
        print(f"'{email}' 사용자를 관리자로 설정 중...")
        conn = get_db_connection()
        cur = conn.cursor()
        
        # 사용자 확인
        cur.execute('SELECT id, username, email FROM users WHERE email = %s', (email,))
        user = cur.fetchone()
        
        if not user:
            print(f"❌ '{email}' 사용자를 찾을 수 없습니다.")
            return False
        
        # 관리자로 설정
        cur.execute('UPDATE users SET is_admin = TRUE WHERE email = %s', (email,))
        conn.commit()
        
        print(f"✅ '{email}' 사용자가 관리자로 설정되었습니다.")
        print(f"   사용자 ID: {user[0]}, 사용자명: {user[1]}")
        return True
        
    except Exception as e:
        print(f"❌ 오류 발생: {e}")
        if conn:
            conn.rollback()
        return False
    finally:
        if conn:
            cur.close()
            conn.close()

def create_admin_account(email, username, password, company=''):
    """관리자 계정 생성"""
    conn = None
    try:
        print(f"관리자 계정 생성 중: {email}")
        conn = get_db_connection()
        cur = conn.cursor()
        
        # 이메일 중복 확인
        cur.execute('SELECT id FROM users WHERE email = %s', (email,))
        if cur.fetchone():
            print(f"❌ '{email}' 이메일이 이미 등록되어 있습니다.")
            return False
        
        # 관리자 계정 생성
        hashed_password = generate_password_hash(password)
        cur.execute("""
            INSERT INTO users (username, company, email, password, is_admin, plan, upload_count, pro_trial_count)
            VALUES (%s, %s, %s, %s, TRUE, 'pro', 999, 999)
        """, (username, company, email, hashed_password))
        
        conn.commit()
        print(f"✅ 관리자 계정이 생성되었습니다.")
        print(f"   이메일: {email}")
        print(f"   사용자명: {username}")
        print(f"   비밀번호: {password}")
        return True
        
    except Exception as e:
        print(f"❌ 오류 발생: {e}")
        if conn:
            conn.rollback()
        return False
    finally:
        if conn:
            cur.close()
            conn.close()

def list_all_users():
    """모든 사용자 목록 조회"""
    conn = None
    try:
        conn = get_db_connection()
        cur = conn.cursor()
        
        cur.execute("""
            SELECT id, username, email, is_admin, plan 
            FROM users 
            ORDER BY id
        """)
        users = cur.fetchall()
        
        print("\n=== 사용자 목록 ===")
        for user in users:
            admin_status = "관리자" if user[3] else "일반"
            print(f"ID: {user[0]}, 이름: {user[1]}, 이메일: {user[2]}, 권한: {admin_status}, 플랜: {user[4]}")
        
        return users
        
    except Exception as e:
        print(f"❌ 오류 발생: {e}")
        return []
    finally:
        if conn:
            cur.close()
            conn.close()

if __name__ == '__main__':
    import sys
    
    if len(sys.argv) < 2:
        print("사용법:")
        print("  1. 기존 사용자를 관리자로 설정:")
        print("     python set_admin.py set <이메일>")
        print("")
        print("  2. 새 관리자 계정 생성:")
        print("     python set_admin.py create <이메일> <사용자명> <비밀번호> [회사명]")
        print("")
        print("  3. 모든 사용자 목록 보기:")
        print("     python set_admin.py list")
        print("")
        print("예시:")
        print("  python set_admin.py set admin@example.com")
        print("  python set_admin.py create admin@example.com admin password123")
        sys.exit(1)
    
    command = sys.argv[1]
    
    if command == 'set':
        if len(sys.argv) < 3:
            print("❌ 이메일을 입력해주세요.")
            sys.exit(1)
        email = sys.argv[2]
        set_admin_by_email(email)
    
    elif command == 'create':
        if len(sys.argv) < 5:
            print("❌ 이메일, 사용자명, 비밀번호를 입력해주세요.")
            sys.exit(1)
        email = sys.argv[2]
        username = sys.argv[3]
        password = sys.argv[4]
        company = sys.argv[5] if len(sys.argv) > 5 else ''
        create_admin_account(email, username, password, company)
    
    elif command == 'list':
        list_all_users()
    
    else:
        print(f"❌ 알 수 없는 명령어: {command}")
        sys.exit(1)

