from flask import render_template, jsonify, current_app, redirect, url_for, flash, request
from flask_login import login_required, current_user
from datetime import datetime
from app.services.time_tracking_service import time_tracking_service
from app.models.contract import Contract
from app.models.time_tracking import TimeEntry  
from app.blueprints.contracts import contracts_bp


@contracts_bp.route('/contracts/<int:contract_id>/hours/edit', methods=['GET', 'POST'], endpoint='contract_hours_edit')
@login_required
def contract_hours_edit(contract_id):
    """Render the Edit Hours interface for a contract"""
    contract = Contract.query.get(contract_id)
    if not contract:
        flash("Contract not found", "danger")
        return redirect(url_for('contracts.contracts_list'))

    hours_data = time_tracking_service.get_contract_hours(contract_id)
    if not hours_data.get("success"):
        current_app.logger.error(f"Error loading hours for contract {contract_id}: {hours_data.get('error')}")
        return jsonify({"error": "Error loading hour editing interface"}), 500

    is_contractor = current_user.id == contract.contractor_id

    return render_template(
        'contracts/hours_edit.html',
        contract=contract,
        hours_data=hours_data,
        is_contractor=is_contractor
    )

@contracts_bp.route('/contracts/<int:contract_id>/hours/add', methods=['POST'])
@login_required
def add_time_entry(contract_id):
    """Add a new manual time entry (supports detailed or simple mode)"""
    from app.models.contract import Contract
    from app.extensions import db
    from app.services.time_tracking_service import time_tracking_service  # ✅ CORRECT IMPORT

    data = request.get_json() or {}
    current_app.logger.info(f"[Add Entry] Data received: {data}")

    # Step 1: Validate contract
    contract = Contract.query.get(contract_id)
    if not contract:
        return jsonify({"success": False, "error": "Contract not found"}), 404

    # Step 2: Check access
    if current_user.id not in [contract.contractor_id, contract.worker_id]:
        return jsonify({'success': False, 'error': 'Access denied'}), 403

    # Step 3: Simple mode - total hours only (this is what your form uses)
    try:
        result = time_tracking_service.create_time_entry(
            contract_id=contract_id,
            worker_id=contract.worker_id,  # Use contract's worker_id
            hours=data.get('hours'),
            work_date=data.get('work_date'),  # Already in DD-MM-YYYY format from frontend
            description=data.get('description', ''),
            location=''  # No location field in your form
        )

        if result.get('success'):
            db.session.commit()
            current_app.logger.info(f"[Add Entry] Success: {result}")
            return jsonify(result), 201
        else:
            db.session.rollback()
            current_app.logger.error(f"[Add Entry] Failed: {result.get('error')}")
            return jsonify(result), 400

    except Exception as e:
        db.session.rollback()
        current_app.logger.error(f"[Add Entry] Exception: {e}")
        return jsonify({'success': False, 'error': str(e)}), 400

@contracts_bp.route('/api/time-entries/<int:entry_id>', methods=['PUT'])
@login_required
def update_time_entry(entry_id):
    """Update a specific time entry (hours, description, or location)."""
    entry = TimeEntry.query.get(entry_id)
    if not entry:
        return jsonify({'success': False, 'error': 'Time entry not found'}), 404

    # ✅ Authorization check — only the worker who made the entry can edit
    if entry.worker_id != current_user.id:
        return jsonify({'success': False, 'error': 'Not authorized'}), 403

    data = request.get_json() or {}
    hours = data.get('hours')
    description = data.get('description')
    location = data.get('location')

    result = time_tracking_service.edit_time_entry(
        entry_id=entry_id,
        user_id=current_user.id,  # Correct authorization argument
        hours=hours,
        description=description,
        location=location
    )

    return jsonify(result)


@contracts_bp.route("/api/contracts/<int:contract_id>/hours-summary")
@login_required
def get_hours_summary(contract_id):
    """
    Return updated hour summary for a contract (AJAX endpoint)
    """
    from app.services.time_tracking_service import TimeTrackingService

    service = TimeTrackingService()
    result = service.get_contract_hours(contract_id)

    if not result.get("success"):
        return jsonify(success=False, error=result.get("error", "Unknown error")), 400

    # Only return summary (the front-end doesn’t need all entries)
    return jsonify(success=True, summary=result["summary"])