from flask import Blueprint, request, render_template, redirect, url_for, flash, jsonify
from functions.database import get_db_connection, MaterialVendido, Militante, TipoMaterial
from functions.decorators import require_login
from utils.date_utils import validar_data, converter_data
from datetime import datetime
from flask_login import current_user

material_bp = Blueprint('material', __name__)

@material_bp.route("/materiais")
@require_login
def listar():
    """Lista todos os materiais com controle de permissões no nível de dados"""
    db = get_db_connection()
    try:
        # SEMPRE renderizar o template, mas filtrar os dados baseado nas permissões
        materiais = []
        
        # Verificar permissões para filtrar dados
        if current_user.is_admin:
            # Admin vê todos
            materiais = db.query(MaterialVendido).join(Militante).join(TipoMaterial).order_by(MaterialVendido.data_venda.desc()).all()
        elif hasattr(current_user, 'has_permission'):
            # Outros usuários veem baseado nas suas permissões
            # Por enquanto, mostrar todos - pode ser refinado depois
            materiais = db.query(MaterialVendido).join(Militante).join(TipoMaterial).order_by(MaterialVendido.data_venda.desc()).all()
        
        # Buscar tipos para o template
        tipos_materiais = db.query(TipoMaterial).order_by(TipoMaterial.descricao).all()
        
        # SEMPRE renderizar o template, independente das permissões
        return render_template('listar_materiais.html', 
                             materiais=materiais, 
                             tipos_materiais=tipos_materiais)
    except Exception as e:
        print(f"Erro no controller de materiais: {e}")
        # Em caso de erro, renderizar com dados vazios
        return render_template('listar_materiais.html', 
                             materiais=[], 
                             tipos_materiais=[])
    finally:
        db.close()

@material_bp.route("/materiais/novo", methods=["GET", "POST"])
@require_login
def novo():
    """Cria um novo material vendido"""
    if request.method == "POST":
        try:
            militante_id = request.form.get("militante_id")
            tipo_material_id = request.form.get("tipo_material_id")
            descricao = request.form.get("descricao")
            valor = float(request.form.get("valor"))
            data_venda = converter_data(request.form.get("data_venda"))
            
            if not validar_data(data_venda):
                flash('Data de venda inválida ou futura', 'danger')
                return redirect(url_for('material.novo'))
            
            db = get_db_connection()
            material = MaterialVendido(
                militante_id=militante_id,
                tipo_material_id=tipo_material_id,
                descricao=descricao,
                valor=valor,
                data_venda=data_venda
            )
            db.add(material)
            db.commit()
            flash('Material cadastrado com sucesso!', 'success')
            return redirect(url_for('material.listar'))
        except Exception as e:
            db.rollback()
            flash('Erro ao cadastrar material', 'danger')
            return redirect(url_for('material.novo'))
        finally:
            db.close()

    # GET - Renderizar formulário
    db = get_db_connection()
    try:
        militantes = db.query(Militante).order_by(Militante.nome).all()
        tipos_material = db.query(TipoMaterial).order_by(TipoMaterial.descricao).all()
        return render_template("novo_material.html", militantes=militantes, tipos_material=tipos_material)
    finally:
        db.close()

@material_bp.route('/materiais/editar/<int:id>', methods=['GET', 'POST'])
@require_login
def editar(id):
    """Edita um material vendido"""
    db = get_db_connection()
    try:
        material = db.query(MaterialVendido).get(id)
        if not material:
            flash('Material não encontrado.', 'danger')
            return redirect(url_for('material.listar'))
        
        if request.method == "POST":
            try:
                material.militante_id = request.form.get("militante_id")
                material.tipo_material_id = request.form.get("tipo_material_id")
                material.descricao = request.form.get("descricao")
                material.valor = float(request.form.get("valor"))
                material.data_venda = converter_data(request.form.get("data_venda"))
                
                db.commit()
                flash('Material atualizado com sucesso!', 'success')
                return redirect(url_for('material.listar'))
            except Exception as e:
                db.rollback()
                flash('Erro ao atualizar material.', 'danger')
                print(f"Erro ao atualizar material: {e}")
        
        militantes = db.query(Militante).order_by(Militante.nome).all()
        tipos_material = db.query(TipoMaterial).order_by(TipoMaterial.descricao).all()
        return render_template("editar_material.html", material=material, militantes=militantes, tipos_material=tipos_material)
    finally:
        db.close()

@material_bp.route("/materiais/excluir/<int:id>", methods=["POST"])
@require_login
def excluir(id):
    """Exclui um material vendido"""
    db = get_db_connection()
    try:
        material = db.query(MaterialVendido).get(id)
        if not material:
            flash('Material não encontrado.', 'danger')
            return redirect(url_for('material.listar'))
        
        db.delete(material)
        db.commit()
        flash('Material excluído com sucesso!', 'success')
        
    except Exception as e:
        db.rollback()
        flash('Erro ao excluir material.', 'danger')
        print(f"Erro ao excluir material: {e}")
    finally:
        db.close()
    
    return redirect(url_for('material.listar'))

@material_bp.route("/tipos-materiais")
@require_login
def listar_tipos():
    """Lista todos os tipos de materiais com controle de permissões no nível de dados"""
    db = get_db_connection()
    try:
        # SEMPRE renderizar o template, mas filtrar os dados baseado nas permissões
        tipos_materiais = []
        
        # Verificar permissões para filtrar dados
        if current_user.is_admin:
            # Admin vê todos
            tipos_materiais = db.query(TipoMaterial).order_by(TipoMaterial.descricao).all()
        elif hasattr(current_user, 'has_permission'):
            # Outros usuários veem baseado nas suas permissões
            # Por enquanto, mostrar todos - pode ser refinado depois
            tipos_materiais = db.query(TipoMaterial).order_by(TipoMaterial.descricao).all()
        
        # SEMPRE renderizar o template, independente das permissões
        return render_template('listar_tipos_materiais.html', tipos_materiais=tipos_materiais)
    except Exception as e:
        print(f"Erro no controller de tipos de materiais: {e}")
        # Em caso de erro, renderizar com dados vazios
        return render_template('listar_tipos_materiais.html', tipos_materiais=[])
    finally:
        db.close()

@material_bp.route("/tipos-materiais/novo", methods=["GET", "POST"])
@require_login
def novo_tipo():
    """Cria um novo tipo de material"""
    if request.method == "POST":
        try:
            descricao = request.form.get("descricao")
            
            db = get_db_connection()
            tipo = TipoMaterial(descricao=descricao)
            db.add(tipo)
            db.commit()
            flash('Tipo de material cadastrado com sucesso!', 'success')
            return redirect(url_for('material.listar_tipos'))
        except Exception as e:
            db.rollback()
            flash('Erro ao cadastrar tipo de material', 'danger')
            return redirect(url_for('material.novo_tipo'))
        finally:
            db.close()

    return render_template("novo_tipo_material.html")

@material_bp.route('/tipos-materiais/editar/<int:id>', methods=['GET', 'POST'])
@require_login
def editar_tipo(id):
    """Edita um tipo de material"""
    db = get_db_connection()
    try:
        tipo = db.query(TipoMaterial).get(id)
        if not tipo:
            flash('Tipo de material não encontrado.', 'danger')
            return redirect(url_for('material.listar_tipos'))
        
        if request.method == "POST":
            try:
                tipo.descricao = request.form.get("descricao")
                db.commit()
                flash('Tipo de material atualizado com sucesso!', 'success')
                return redirect(url_for('material.listar_tipos'))
            except Exception as e:
                db.rollback()
                flash('Erro ao atualizar tipo de material.', 'danger')
                print(f"Erro ao atualizar tipo de material: {e}")
        
        return render_template("editar_tipo_material.html", tipo=tipo)
    finally:
        db.close()

@material_bp.route("/tipos-materiais/excluir/<int:id>", methods=["POST"])
@require_login
def excluir_tipo(id):
    """Exclui um tipo de material"""
    db = get_db_connection()
    try:
        tipo = db.query(TipoMaterial).get(id)
        if not tipo:
            flash('Tipo de material não encontrado.', 'danger')
            return redirect(url_for('material.listar_tipos'))
        
        db.delete(tipo)
        db.commit()
        flash('Tipo de material excluído com sucesso!', 'success')
        
    except Exception as e:
        db.rollback()
        flash('Erro ao excluir tipo de material.', 'danger')
        print(f"Erro ao excluir tipo de material: {e}")
    finally:
        db.close()
    
    return redirect(url_for('material.listar_tipos')) 