from flask import Blueprint, render_template, request, redirect, url_for, flash
from datetime import datetime, timedelta
from extensions import db
from models import Employee, Attendance, Holiday, LeaveRequest, DesktimeLog
from sqlalchemy import and_
from cli.attendance_cli import fetch_and_store_desktime
from flask_login import login_required
from models import SyncLog

desktime_logs_bp = Blueprint('desktime_logs', __name__, url_prefix='/desktime')

@desktime_logs_bp.route('/logs', methods=['GET', 'POST'])
def desktime_logs():
    employees = Employee.query.filter(Employee.desktime_id.isnot(None)).all()
    summary = None
    logs = []

    if request.method == 'POST':
        selected_emp_ids = request.form.getlist('employee_ids')
        date = request.form.get('specific_date')
        month = request.form.get('month')

        if not selected_emp_ids:
            flash("Please select at least one employee.", "danger")
            return redirect(url_for('desktime_logs.desktime_logs'))

        if not date and not month:
            flash("Please select either a date or a month.", "danger")
            return redirect(url_for('desktime_logs.desktime_logs'))

        # Parse date range
        if date:
            start_date = end_date = datetime.strptime(date, '%Y-%m-%d').date()
        else:
            start_date = datetime.strptime(month, '%Y-%m').date().replace(day=1)
            end_date = (start_date.replace(month=start_date.month % 12 + 1, day=1) - timedelta(days=1))

        updated_records = 0
        errors = []
        updated_attendance_rows = []

        for emp_id in selected_emp_ids:
            emp = Employee.query.get(emp_id)
            if not emp or not emp.desktime_id:
                continue

            curr_date = start_date
            while curr_date <= end_date and curr_date <= datetime.today().date():
                # Delete existing attendance + desktime log
                Attendance.query.filter_by(employee_id=emp.id, date=curr_date).delete()
                DesktimeLog.query.filter_by(employee_id=emp.id, date=curr_date).delete()
                db.session.commit()

                try:
                    hours = fetch_and_store_desktime(emp, curr_date)
                    remarks = 'Present' if hours >= 7 else 'Half Day' if hours >= 4 else 'LWP'

                    # Override to Holiday/Leave if exists
                    holiday = Holiday.query.filter_by(date=curr_date).first()
                    leave = LeaveRequest.query.filter_by(employee_id=emp.id, status='final_approved') \
                        .filter(LeaveRequest.start_date <= curr_date, LeaveRequest.end_date >= curr_date).first()

                    if holiday:
                        remarks = 'Holiday'
                    elif leave:
                        remarks = 'Leave'

                    attendance = Attendance(
                        employee_id=emp.id,
                        date=curr_date,
                        check_in_time=None,
                        check_out_time=None,
                        working_hours=hours,
                        remarks=remarks,
                        source='Desktime'
                    )
                    db.session.add(attendance)
                    db.session.commit()
                    updated_attendance_rows.append(attendance)
                    updated_records += 1

                except Exception as e:
                    errors.append(f"{emp.full_name} on {curr_date}: {str(e)}")

                curr_date += timedelta(days=1)

        summary = {
            'total_updated': updated_records,
            'errors': errors
        }
        logs = updated_attendance_rows

    return render_template('attendance/desktime_logs.html', employees=employees, summary=summary, logs=logs)


@desktime_logs_bp.route('/logs')
@login_required
def view_sync_logs():
    logs = SyncLog.query.order_by(SyncLog.started_at.desc()).limit(100).all()
    return render_template('desktime_logs/logs.html', logs=logs)