from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import current_user, login_required

from app.helpers import (
    copropriete_required,
    get_copropriete_active,
    link_user_to_copropriete,
    resolve_copropriete_public_id,
    set_copropriete_id,
)
from app.models import Copropriete, Lot, Personne, UserCopropriete, db
from app.phone import TEL_AFFICHAGE_CHOICES

bp = Blueprint("main", __name__)


@bp.route("/")
def index():
    if current_user.is_authenticated:
        return redirect(url_for("main.dashboard"))
    return redirect(url_for("auth.login"))


@bp.route("/dashboard", methods=["GET", "POST"])
@login_required
@copropriete_required
def dashboard(copropriete):
    if request.method == "POST" and request.form.get("action") == "switch":
        copro = resolve_copropriete_public_id(request.form.get("copropriete_id", ""))
        if copro:
            set_copropriete_id(copro.id)
            copropriete = copro

    coproprietes = (
        Copropriete.query_actifs()
        .join(UserCopropriete)
        .filter(UserCopropriete.user_id == current_user.id)
        .order_by(Copropriete.nom)
        .all()
    )
    nb_personnes = (
        Personne.query_actifs().filter_by(copropriete_id=copropriete.id).count()
    )
    nb_lots = Lot.query_actifs().filter_by(copropriete_id=copropriete.id).count()
    return render_template(
        "main/dashboard.html",
        copropriete=copropriete,
        coproprietes=coproprietes,
        nb_personnes=nb_personnes,
        nb_lots=nb_lots,
    )


@bp.route("/copropriete/select", methods=["GET", "POST"])
@login_required
def select_copropriete():
    copros = (
        Copropriete.query_actifs()
        .join(UserCopropriete)
        .filter(UserCopropriete.user_id == current_user.id)
        .order_by(Copropriete.nom)
        .all()
    )

    if request.method == "POST":
        action = request.form.get("action")
        if action == "select":
            copro = resolve_copropriete_public_id(request.form.get("copropriete_id", ""))
            if copro:
                set_copropriete_id(copro.id)
                flash("Copropriété sélectionnée.", "success")
                return redirect(url_for("main.dashboard"))
            flash("Accès refusé.", "danger")
        elif action == "create":
            nom = request.form.get("nom", "").strip()
            adresse = request.form.get("adresse", "").strip()
            if not nom:
                flash("Le nom est obligatoire.", "danger")
            else:
                copro = Copropriete(nom=nom, adresse=adresse)
                db.session.add(copro)
                db.session.flush()
                link_user_to_copropriete(current_user.id, copro.id)
                db.session.commit()
                set_copropriete_id(copro.id)
                flash(f"Copropriété « {nom} » créée.", "success")
                return redirect(url_for("main.dashboard"))

    active = get_copropriete_active()
    return render_template(
        "main/select_copropriete.html", coproprietes=copros, active=active
    )


@bp.route("/mon-compte", methods=["GET", "POST"])
@login_required
def mon_compte():
    if request.method == "POST":
        tel_affichage = request.form.get("tel_affichage", "")
        if tel_affichage in TEL_AFFICHAGE_CHOICES:
            current_user.tel_affichage = tel_affichage
            db.session.commit()
            flash("Préférences enregistrées.", "success")
            return redirect(url_for("main.mon_compte"))
        flash("Format de téléphone invalide.", "danger")

    return render_template("main/mon_compte.html")
