from flask_login import current_user, login_required
from flask import Blueprint, request, jsonify, render_template, session
from app.models import Contract, User
from app.extensions import db
from app.contract_template import generate_contract
from datetime import datetime
from sqlalchemy import text

closeout_bp = Blueprint("closeout", __name__)

@closeout_bp.route("/contracts/<int:contract_id>/mark-complete", methods=["POST"])
def mark_complete():
    """Worker marks work complete with hours"""
    contract = Contract.query.get_or_404(contract_id)
    user_id = current_user.id
    
    # Only worker can mark complete
    if contract.worker_id != user_id:
        return jsonify({"error": "Unauthorized"}), 403
    
    # Get hours worked from form
    hours_worked = request.form.get("actual_hours_worked", type=float)
    completion_notes = request.form.get("completion_notes", "")
    
    if not hours_worked or hours_worked <= 0:
        return jsonify({"error": "Please enter valid hours worked"}), 400
    
    # Update contract
    contract.actual_hours_worked = hours_worked
    contract.completion_notes = completion_notes
    contract.status = "pending_review"
    contract.worker_closeout_date = datetime.utcnow()
    
    db.session.commit()
    
    return jsonify({
        "success": True,
        "message": f"Work marked complete! {hours_worked} hours logged. Waiting for contractor review.",
        "status": contract.status
    })

@closeout_bp.route("/contracts/<int:contract_id>/contractor-review", methods=["POST"])
def contractor_review():
    """Contractor reviews completed work"""
    contract = Contract.query.get_or_404(contract_id)
    user_id = current_user.id
    
    # Only contractor can review
    if contract.contractor_id != user_id:
        return jsonify({"error": "Unauthorized"}), 403
    
    action = request.form.get("action")  # "approve" or "dispute"
    
    if action == "approve":
        contract.status = "pending_rating"
        contract.contractor_closeout_date = datetime.utcnow()
        message = "Work approved! Ready for final ratings."
    elif action == "dispute":
        contract.status = "disputed"
        message = "Work disputed. Both parties will be contacted."
    else:
        return jsonify({"error": "Invalid action"}), 400
    
    db.session.commit()
    
    return jsonify({
        "success": True,
        "message": message,
        "status": contract.status
    })

@closeout_bp.route("/contracts/<int:contract_id>/rate", methods=["POST"])
def submit_rating():
    """Submit anonymous rating after completion"""
    contract = Contract.query.get_or_404(contract_id)
    user_id = current_user.id
    
    # Check user is part of this contract
    if user_id not in [contract.contractor_id, contract.worker_id]:
        return jsonify({"error": "Unauthorized"}), 403
    
    # Determine who is rating whom
    if user_id == contract.contractor_id:
        reviewee_id = contract.worker_id  # Contractor rating worker
    else:
        reviewee_id = contract.contractor_id  # Worker rating contractor
    
    # Get ratings
    prof_rating = request.form.get("overall_rating", type=int)
    quality_rating = request.form.get("quality_rating", type=int)
    comm_rating = request.form.get("communication_rating", type=int)
    comment = request.form.get("comment", "")
    
    # Validate ratings
    if not all(1 <= r <= 5 for r in [prof_rating, quality_rating, comm_rating]):
        return jsonify({"error": "All ratings must be between 1-5"}), 400
    
    # Store review
    db.session.execute(text("""
        INSERT INTO reviews (contract_id, reviewer_id, reviewee_id, job_id, 
                           overall_rating, quality_rating, communication_rating, safety_rating, 
                           comment)
        VALUES (:contract_id, :reviewer_id, :reviewee_id, :job_id, :prof, :quality, :comm, :safety, :text)
    """), {
        "contract_id": contract_id,
        "job_id": contract.job_id,
        "reviewer_id": user_id,
        "reviewee_id": reviewee_id,
        "prof": prof_rating,
        "quality": quality_rating,
        "comm": comm_rating,
        "safety": 5,  # Default safety rating for now
        "text": comment
    })
    
    # Increment pending reviews for reviewee
    db.session.execute(text("""
        UPDATE users 
        SET pending_reviews = pending_reviews + 1 
        WHERE id = :user_id
    """), {"user_id": reviewee_id})
    
    # Mark rating as completed for this user
    if user_id == contract.contractor_id:
        contract.contractor_reviewed = True
    else:
        contract.worker_reviewed = True
    
    # If both have rated, mark contract as fully completed
    if contract.contractor_reviewed and contract.worker_reviewed:
        contract.mark_as_completed()  # Use method to properly set status, completion_status, and increment jobs_completed
        
        # TRIGGER PAYMENT RELEASE AND INVOICE GENERATION
        # Find payment and auto-generate invoice for all workers
        payment = contract.payments.filter_by(status='pending_release').first()
        if not payment:
            payment = contract.payments.filter_by(status='held_escrow').first()
        
        if payment:
            # Update payment status
            payment.status = 'transferred'
            payment.date_released = datetime.utcnow()
            
            # Auto-generate invoice for GST-registered workers
            try:
                invoice = payment.auto_generate_invoice()
                if invoice:
                    print(f"📄 Auto-generated invoice: {invoice.invoice_number}")
            except Exception as invoice_error:
                print(f"⚠️ Invoice generation failed: {invoice_error}")
    
    db.session.commit()
    
    return jsonify({
        "success": True,
        "message": "Rating submitted! Thank you for your feedback.",
        "anonymous_note": "Your rating will be included in their overall score anonymously."
    })

@closeout_bp.route("/contracts/<int:contract_id>/closeout-status")
def closeout_status():
    """Get contract closeout status for both parties"""
    contract = Contract.query.get_or_404(contract_id)
    user_id = current_user.id
    
    if user_id not in [contract.contractor_id, contract.worker_id]:
        return jsonify({"error": "Unauthorized"}), 403
    
    user_role = "contractor" if user_id == contract.contractor_id else "worker"
    
    return jsonify({
        "contract_id": contract_id,
        "job_id": contract.job_id,
        "status": contract.status,
        "user_role": user_role,
        "actual_hours_worked": contract.actual_hours_worked,
        "completion_notes": contract.completion_notes,
        "contractor_reviewed": contract.contractor_reviewed,
        "worker_reviewed": contract.worker_reviewed
    })
