from flask import Blueprint, render_template, request, redirect, url_for, flash
from flask_login import login_required, current_user
from models import db, Department, Designation, MasterChangeLog, Employee
from datetime import datetime
from sqlalchemy import or_

master_bp = Blueprint('master', __name__, url_prefix='/master')

def log_master_change(table, record_id, field, old, new, employee_id):
    log = MasterChangeLog(
        table_name=table,
        record_id=record_id,
        field_name=field,
        old_value=old,
        new_value=new,
        changed_by=employee_id,
        changed_on=datetime.utcnow()
    )
    db.session.add(log)

# -------------------------------
# Department Master
# -------------------------------
@master_bp.route('/department', methods=['GET', 'POST'])
@login_required
def manage_departments():
    if request.method == 'POST':
        dept_id = request.form.get('id')
        name = request.form.get('name').strip()

        if dept_id:  # Edit
            dept = Department.query.get(int(dept_id))
            if dept.name != name:
                log_master_change("department", dept.id, "name", dept.name, name, current_user.id)
                dept.name = name
                dept.updated_by = current_user.id
        else:  # Add
            dept = Department(name=name, created_by=current_user.id)
            db.session.add(dept)

        db.session.commit()
        flash("✅ Department saved successfully", "success")
        return redirect(url_for('master.manage_departments'))

    search = request.args.get('search', '').strip()
    page = request.args.get('page', 1, type=int)

    query = Department.query
    if search:
        query = query.filter(Department.name.ilike(f"%{search}%"))

    departments = query.order_by(Department.name).paginate(page=page, per_page=10)
    return render_template("master/department_master.html", departments=departments, search=search)

@master_bp.route('/department/delete/<int:id>', methods=['POST'])
@login_required
def delete_department(id):
    dept = Department.query.get_or_404(id)
    log_master_change("department", dept.id, "name", dept.name, "[DELETED]", current_user.id)
    db.session.delete(dept)
    db.session.commit()
    flash("⚠️ Department deleted", "warning")
    return redirect(url_for('master.manage_departments'))

# -------------------------------
# Designation Master
# -------------------------------
@master_bp.route('/designation', methods=['GET', 'POST'])
@login_required
def manage_designations():
    if request.method == 'POST':
        desig_id = request.form.get('id')
        title = request.form.get('title').strip()

        if desig_id:  # Edit
            desig = Designation.query.get(int(desig_id))
            if desig.title != title:
                log_master_change("designation", desig.id, "title", desig.title, title, current_user.id)
                desig.title = title
                desig.updated_by = current_user.id
        else:  # Add
            desig = Designation(title=title, created_by=current_user.id)
            db.session.add(desig)

        db.session.commit()
        flash("✅ Designation saved successfully", "success")
        return redirect(url_for('master.manage_designations'))

    search = request.args.get('search', '').strip()
    page = request.args.get('page', 1, type=int)

    query = Designation.query
    if search:
        query = query.filter(Designation.title.ilike(f"%{search}%"))

    designations = query.order_by(Designation.title).paginate(page=page, per_page=10)
    return render_template("master/designation_master.html", designations=designations, search=search)

@master_bp.route('/designation/delete/<int:id>', methods=['POST'])
@login_required
def delete_designation(id):
    desig = Designation.query.get_or_404(id)
    log_master_change("designation", desig.id, "title", desig.title, "[DELETED]", current_user.id)
    db.session.delete(desig)
    db.session.commit()
    flash("⚠️ Designation deleted", "warning")
    return redirect(url_for('master.manage_designations'))

# -------------------------------
# Master Logs Viewer
# -------------------------------
@master_bp.route('/master/logs', methods=['GET'])
@login_required
def view_master_logs():
    search = request.args.get('search', '').strip()
    master_type = request.args.get('type', '').strip()
    page = request.args.get('page', 1, type=int)

    query = MasterChangeLog.query.join(Employee, MasterChangeLog.changed_by == Employee.id)

    if search:
        query = query.filter(
            or_(
                MasterChangeLog.field_name.ilike(f"%{search}%"),
                MasterChangeLog.old_value.ilike(f"%{search}%"),
                MasterChangeLog.new_value.ilike(f"%{search}%"),
                Employee.full_name.ilike(f"%{search}%")
            )
        )
    if master_type:
        query = query.filter(MasterChangeLog.table_name == master_type)

    logs = query.order_by(MasterChangeLog.changed_on.desc()).paginate(page=page, per_page=10)

    return render_template("master/view_master_logs.html", logs=logs, search=search, master_type=master_type)