from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required
import time
import logging
from scrapers.act import ACTLicenseCheckerAPI
from scrapers.qld import QLDLicenseCheckerAPI
from scrapers.ntc import NTLicenseCheckerAPI
from scrapers.nsw import NSWLicenseCheckerAPI
from scrapers.vic import SeleniumVICLicenseChecker
    
# Configure logging
logger = logging.getLogger(__name__)

# Create blueprint for CSV processing routes
csv_bp = Blueprint('csv', __name__)

# Initialize the license checkers
license_checker = ACTLicenseCheckerAPI()
qld_license_checker = QLDLicenseCheckerAPI()
nt_license_checker = NTLicenseCheckerAPI()
nsw_license_checker = NSWLicenseCheckerAPI()
vic_license_checker = SeleniumVICLicenseChecker()


@csv_bp.route('/api/process-act-csv', methods=['POST'])
@jwt_required()
def process_act_csv():
    """Process JSON data and return results as JSON"""
    try:
        # Check if JSON data was provided
        if not request.is_json:
            return jsonify({
                'error': 'Invalid content type',
                'message': 'Please provide JSON data'
            }), 400

        data = request.get_json()
        
        # Check if data contains records
        if not data or 'records' not in data:
            return jsonify({
                'error': 'Invalid data format',
                'message': 'Please provide records array in JSON format'
            }), 400

        records = data['records']
        
        # Check if records is a list
        if not isinstance(records, list):
            return jsonify({
                'error': 'Invalid records format',
                'message': 'Records must be an array'
            }), 400

        # Process the records
        results = license_checker.process_records(records)
        
        return jsonify({
            'success': True,
            'message': f'Successfully processed {len(results)} records',
            'data': results,
            'total_records': len(results)
        })

    except Exception as e:
        logger.error(f"API error: {e}")
        return jsonify({
            'error': 'Processing failed',
            'message': str(e)
        }), 500

@csv_bp.route('/api/process-nsw-csv', methods=['POST'])
@jwt_required()
def process_nsw_csv():
    """Process JSON data for NSW license checking and return results as JSON"""
    try:
        # Check if JSON data was provided
        if not request.is_json:
            return jsonify({
                'error': 'Invalid content type',
                'message': 'Please provide JSON data'
            }), 400

        data = request.get_json()
        
        # Check if data contains records
        if not data or 'records' not in data:
            return jsonify({
                'error': 'Invalid data format',
                'message': 'Please provide records array in JSON format'
            }), 400

        records = data['records']
        
        # Check if records is a list
        if not isinstance(records, list):
            return jsonify({
                'error': 'Invalid records format',
                'message': 'Records must be an array'
            }), 400

        # Process the records
        results = nsw_license_checker.process_records(records)
        
        # Get processing statistics
        stats = nsw_license_checker.get_processing_stats(results)
        
        return jsonify({
            'success': True,
            'message': f'Successfully processed {len(results)} records',
            'data': results,
            'statistics': stats,
            'total_records': len(results)
        })

    except Exception as e:
        logger.error(f"NSW API error: {e}")
        return jsonify({
            'error': 'Processing failed',
            'message': str(e)
        }), 500
    
@csv_bp.route('/api/process-nt-csv', methods=['POST'])
@jwt_required()
def process_nt_csv():
    """Process JSON data for NT license checking and return results as JSON"""
    try:
        # Check if JSON data was provided
        if not request.is_json:
            return jsonify({
                'error': 'Invalid content type',
                'message': 'Please provide JSON data'
            }), 400

        data = request.get_json()
        
        # Check if data contains records
        if not data or 'records' not in data:
            return jsonify({
                'error': 'Invalid data format',
                'message': 'Please provide records array in JSON format'
            }), 400

        records = data['records']
        
        # Check if records is a list
        if not isinstance(records, list):
            return jsonify({
                'error': 'Invalid records format',
                'message': 'Records must be an array'
            }), 400

        # Process the records
        results = nt_license_checker.process_records(records)
        
        # Get processing statistics
        stats = nt_license_checker.get_processing_stats(results)
        
        return jsonify({
            'success': True,
            'message': f'Successfully processed {len(results)} records',
            'data': results,
            'statistics': stats,
            'total_records': len(results)
        })

    except Exception as e:
        logger.error(f"NT API error: {e}")
        return jsonify({
            'error': 'Processing failed',
            'message': str(e)
        }), 500
    
@csv_bp.route('/api/process-qld-csv', methods=['POST'])
@jwt_required()
def process_qld_csv():
    """Process JSON data and return results as JSON"""
    try:
        # Check if JSON data was provided
        if not request.is_json:
            return jsonify({
                'error': 'Invalid content type',
                'message': 'Please provide JSON data'
            }), 400

        data = request.get_json()
        
        # Check if data contains records
        if not data or 'records' not in data:
            return jsonify({
                'error': 'Invalid data format',
                'message': 'Please provide records array in JSON format'
            }), 400

        records = data['records']
        
        # Check if records is a list
        if not isinstance(records, list):
            return jsonify({
                'error': 'Invalid records format',
                'message': 'Records must be an array'
            }), 400

        # Process the records
        results = qld_license_checker.process_records(records)
        
        return jsonify({
            'success': True,
            'message': f'Successfully processed {len(results)} records',
            'data': results,
            'total_records': len(results)
        })

    except Exception as e:
        logger.error(f"API error: {e}")
        return jsonify({
            'error': 'Processing failed',
            'message': str(e)
        }), 500


@csv_bp.route('/api/process-vic-csv', methods=['POST'])
@jwt_required()
def process_vic_csv():
    """Process JSON data for VIC license checking and return results as JSON"""
    try:
        # Check if JSON data was provided
        if not request.is_json:
            return jsonify({
                'error': 'Invalid content type',
                'message': 'Please provide JSON data'
            }), 400

        data = request.get_json()
        
        # Check if data contains records
        if not data or 'records' not in data:
            return jsonify({
                'error': 'Invalid data format',
                'message': 'Please provide records array in JSON format'
            }), 400

        records = data['records']
        
        # Check if records is a list
        if not isinstance(records, list):
            return jsonify({
                'error': 'Invalid records format',
                'message': 'Records must be an array'
            }), 400

        # Process the records
        results = vic_license_checker.process_records(records)
        
        return jsonify({
            'success': True,
            'message': f'Successfully processed {len(results)} records',
            'data': results,
            'total_records': len(results)
        })

    except Exception as e:
        logger.error(f"VIC API error: {e}")
        return jsonify({
            'error': 'Processing failed',
            'message': str(e)
        }), 500