"""
파일 업로드 횟수 관리 유틸리티
"""
from utils.common import get_db_connection


def get_upload_count(user_id):
    """
    사용자의 파일 업로드 남은 횟수를 조회합니다.
    
    Args:
        user_id: 사용자 ID (email 또는 id)
    
    Returns:
        int: 남은 업로드 횟수 (없으면 0)
    """
    conn = get_db_connection()
    cur = conn.cursor()
    
    try:
        # user_id가 email인지 id인지 확인
        if '@' in str(user_id):
            cur.execute('SELECT upload_count FROM users WHERE email = %s', (user_id,))
        else:
            cur.execute('SELECT upload_count FROM users WHERE id = %s', (user_id,))
        
        result = cur.fetchone()
        if result:
            return result[0] if result[0] is not None else 0
        return 0
    except Exception as e:
        print(f"업로드 횟수 조회 오류: {e}")
        return 0
    finally:
        cur.close()
        conn.close()


def can_upload_file(user_id):
    """
    사용자가 파일을 업로드할 수 있는지 확인합니다.
    
    Args:
        user_id: 사용자 ID (email 또는 id)
    
    Returns:
        bool: 파일 업로드 가능 여부
    """
    count = get_upload_count(user_id)
    return count > 0


def use_upload_count(user_id):
    """
    파일 업로드 1회를 사용합니다.
    
    Args:
        user_id: 사용자 ID (email 또는 id)
    
    Returns:
        dict: {
            'success': bool,
            'remaining': int,  # 남은 횟수
            'message': str
        }
    """
    conn = get_db_connection()
    cur = conn.cursor()
    
    try:
        # 현재 횟수 확인
        if '@' in str(user_id):
            cur.execute('SELECT upload_count FROM users WHERE email = %s', (user_id,))
        else:
            cur.execute('SELECT upload_count FROM users WHERE id = %s', (user_id,))
        
        result = cur.fetchone()
        if not result:
            return {
                'success': False,
                'remaining': 0,
                'message': '사용자를 찾을 수 없습니다.'
            }
        
        current_count = result[0] if result[0] is not None else 0
        
        if current_count <= 0:
            return {
                'success': False,
                'remaining': 0,
                'message': '파일 업로드 횟수가 모두 소진되었습니다. Pro 플랜을 구독해주세요.'
            }
        
        # 횟수 차감
        new_count = current_count - 1
        if '@' in str(user_id):
            cur.execute(
                'UPDATE users SET upload_count = %s WHERE email = %s',
                (new_count, user_id)
            )
        else:
            cur.execute(
                'UPDATE users SET upload_count = %s WHERE id = %s',
                (new_count, user_id)
            )
        
        conn.commit()
        
        return {
            'success': True,
            'remaining': new_count,
            'message': f'파일 업로드가 완료되었습니다. 남은 업로드 횟수: {new_count}회'
        }
    except Exception as e:
        conn.rollback()
        print(f"업로드 횟수 사용 오류: {e}")
        return {
            'success': False,
            'remaining': 0,
            'message': f'업로드 횟수 사용 중 오류가 발생했습니다: {str(e)}'
        }
    finally:
        cur.close()
        conn.close()


def check_and_use_upload_count(user_id):
    """
    파일 업로드 가능 여부를 확인하고, 가능하면 1회 차감합니다.
    
    Args:
        user_id: 사용자 ID (email 또는 id)
    
    Returns:
        dict: {
            'allowed': bool,  # 업로드 가능 여부
            'remaining': int,  # 남은 횟수
            'message': str
        }
    """
    if not can_upload_file(user_id):
        count = get_upload_count(user_id)
        return {
            'allowed': False,
            'remaining': count,
            'message': '파일 업로드 횟수가 모두 소진되었습니다. Pro 플랜을 구독해주세요.'
        }
    
    result = use_upload_count(user_id)
    return {
        'allowed': result['success'],
        'remaining': result['remaining'],
        'message': result['message']
    }

