from flask import Blueprint, request, jsonify, session
from src.models.user import db, User
from src.models.company import Company
from src.routes.auth import require_auth, require_role

company_bp = Blueprint('company', __name__)

@company_bp.route('/companies', methods=['GET'])
@require_auth
@require_role('super_admin')
def get_companies():
    """Obtener lista de todas las empresas (solo super_admin)"""
    try:
        page = request.args.get('page', 1, type=int)
        per_page = request.args.get('per_page', 10, type=int)
        search = request.args.get('search', '')
        
        query = Company.query
        
        # Filtrar por búsqueda si se proporciona
        if search:
            query = query.filter(
                (Company.name.contains(search)) | 
                (Company.rnc.contains(search))
            )
        
        # Paginación
        companies = query.paginate(
            page=page, 
            per_page=per_page, 
            error_out=False
        )
        
        return jsonify({
            'companies': [company.to_dict() for company in companies.items],
            'total': companies.total,
            'pages': companies.pages,
            'current_page': page,
            'per_page': per_page
        }), 200
        
    except Exception as e:
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@company_bp.route('/companies', methods=['POST'])
@require_auth
@require_role('super_admin')
def create_company():
    """Crear nueva empresa (solo super_admin)"""
    try:
        data = request.get_json()
        
        # Validar campos requeridos
        required_fields = ['name', 'rnc']
        for field in required_fields:
            if not data.get(field):
                return jsonify({'error': f'Campo {field} es requerido'}), 400
        
        # Verificar que el RNC no exista
        existing_company = Company.query.filter_by(rnc=data.get('rnc')).first()
        if existing_company:
            return jsonify({'error': 'RNC ya existe'}), 409
        
        # Crear nueva empresa
        new_company = Company(
            name=data.get('name'),
            rnc=data.get('rnc'),
            address=data.get('address'),
            phone=data.get('phone'),
            email=data.get('email'),
            status=data.get('status', 'active')
        )
        
        db.session.add(new_company)
        db.session.commit()
        
        return jsonify({
            'message': 'Empresa creada exitosamente',
            'company': new_company.to_dict()
        }), 201
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@company_bp.route('/companies/<int:company_id>', methods=['GET'])
@require_auth
def get_company(company_id):
    """Obtener información de una empresa específica"""
    try:
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        # Super admin puede ver cualquier empresa
        # Otros roles solo pueden ver su propia empresa
        if user_role != 'super_admin' and user_company_id != company_id:
            return jsonify({'error': 'No autorizado para ver esta empresa'}), 403
        
        company = Company.query.get(company_id)
        if not company:
            return jsonify({'error': 'Empresa no encontrada'}), 404
        
        return jsonify({'company': company.to_dict()}), 200
        
    except Exception as e:
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@company_bp.route('/companies/<int:company_id>', methods=['PUT'])
@require_auth
def update_company(company_id):
    """Actualizar información de una empresa"""
    try:
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        # Super admin puede editar cualquier empresa
        # Accountant solo puede editar su propia empresa
        if user_role not in ['super_admin', 'accountant']:
            return jsonify({'error': 'No autorizado para editar empresas'}), 403
        
        if user_role == 'accountant' and user_company_id != company_id:
            return jsonify({'error': 'No autorizado para editar esta empresa'}), 403
        
        company = Company.query.get(company_id)
        if not company:
            return jsonify({'error': 'Empresa no encontrada'}), 404
        
        data = request.get_json()
        
        # Actualizar campos permitidos
        if data.get('name'):
            company.name = data.get('name')
        if data.get('address'):
            company.address = data.get('address')
        if data.get('phone'):
            company.phone = data.get('phone')
        if data.get('email'):
            company.email = data.get('email')
        
        # Solo super_admin puede cambiar RNC y status
        if user_role == 'super_admin':
            if data.get('rnc'):
                # Verificar que el nuevo RNC no exista
                existing_company = Company.query.filter(
                    Company.rnc == data.get('rnc'),
                    Company.id != company_id
                ).first()
                if existing_company:
                    return jsonify({'error': 'RNC ya existe'}), 409
                company.rnc = data.get('rnc')
            
            if data.get('status'):
                company.status = data.get('status')
        
        db.session.commit()
        
        return jsonify({
            'message': 'Empresa actualizada exitosamente',
            'company': company.to_dict()
        }), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@company_bp.route('/companies/<int:company_id>', methods=['DELETE'])
@require_auth
@require_role('super_admin')
def delete_company(company_id):
    """Eliminar una empresa (solo super_admin)"""
    try:
        company = Company.query.get(company_id)
        if not company:
            return jsonify({'error': 'Empresa no encontrada'}), 404
        
        # Verificar que no tenga usuarios asociados
        if company.users:
            return jsonify({'error': 'No se puede eliminar empresa con usuarios asociados'}), 400
        
        # Verificar que no tenga facturas asociadas
        if company.invoices:
            return jsonify({'error': 'No se puede eliminar empresa con facturas asociadas'}), 400
        
        db.session.delete(company)
        db.session.commit()
        
        return jsonify({'message': 'Empresa eliminada exitosamente'}), 200
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

@company_bp.route('/companies/<int:company_id>/users', methods=['GET'])
@require_auth
def get_company_users(company_id):
    """Obtener usuarios de una empresa"""
    try:
        user_role = session.get('user_role')
        user_company_id = session.get('company_id')
        
        # Super admin puede ver usuarios de cualquier empresa
        # Accountant solo puede ver usuarios de su empresa
        if user_role not in ['super_admin', 'accountant']:
            return jsonify({'error': 'No autorizado'}), 403
        
        if user_role == 'accountant' and user_company_id != company_id:
            return jsonify({'error': 'No autorizado para ver usuarios de esta empresa'}), 403
        
        company = Company.query.get(company_id)
        if not company:
            return jsonify({'error': 'Empresa no encontrada'}), 404
        
        users = User.query.filter_by(company_id=company_id).all()
        
        return jsonify({
            'users': [user.to_dict() for user in users],
            'company': company.to_dict()
        }), 200
        
    except Exception as e:
        return jsonify({'error': f'Error interno del servidor: {str(e)}'}), 500

