from flask import Blueprint, flash, redirect, render_template, request, url_for
from flask_login import login_required

from app.helpers import copropriete_required, get_by_public_id, public_id_str
from app.models import Compteur, Lot, Releve, ReleveType, db
from app.soft_delete import STATUT_ACTIF
from app.utils import parse_date

bp = Blueprint("compteurs", __name__, url_prefix="/compteurs")


@bp.route("/releves")
@login_required
@copropriete_required
def releves_liste(copropriete):
    releves = (
        Releve.query_actifs()
        .join(Compteur)
        .join(Lot)
        .filter(Lot.copropriete_id == copropriete.id, Compteur.statut == STATUT_ACTIF)
        .order_by(Releve.date_releve.desc(), Releve.id.desc())
        .limit(100)
        .all()
    )
    return render_template(
        "compteurs/releves_liste.html", releves=releves, copropriete=copropriete
    )


@bp.route("/lot/<uuid:lot_id>/nouveau", methods=["GET", "POST"])
@login_required
@copropriete_required
def nouveau_compteur(copropriete, lot_id):
    lot = get_by_public_id(Lot, lot_id, copropriete_id=copropriete.id)
    releve_types = (
        ReleveType.query.filter_by(copropriete_id=copropriete.id)
        .order_by(ReleveType.ordre)
        .all()
    )
    if request.method == "POST":
        type_id = int(request.form.get("releve_type_id", 0) or 0)
        if not ReleveType.query.filter_by(
            id=type_id, copropriete_id=copropriete.id
        ).first():
            flash("Type de relevé invalide.", "danger")
        else:
            compteur = Compteur(
                lot_id=lot.id,
                releve_type_id=type_id,
                numero=request.form.get("numero", "").strip(),
                emplacement=request.form.get("emplacement", "").strip(),
                date_installation=parse_date(request.form.get("date_installation", "")),
            )
            db.session.add(compteur)
            db.session.commit()
            flash("Point de relevé ajouté.", "success")
            return redirect(url_for("lots.detail", lot_id=lot.public_id))
    return render_template(
        "compteurs/form_compteur.html",
        lot=lot,
        releve_types=releve_types,
        copropriete=copropriete,
    )


@bp.route("/<uuid:compteur_id>/releve", methods=["GET", "POST"])
@login_required
@copropriete_required
def nouveau_releve(copropriete, compteur_id):
    compteur = (
        Compteur.query_actifs()
        .join(Lot)
        .filter(
            Compteur.public_id == public_id_str(compteur_id),
            Lot.copropriete_id == copropriete.id,
        )
        .first_or_404()
    )
    if request.method == "POST":
        releve = Releve(
            compteur_id=compteur.id,
            date_releve=parse_date(request.form.get("date_releve", ""), default_today=True),
            index_valeur=float(request.form["index_valeur"]),
            remarque=request.form.get("remarque", "").strip(),
        )
        db.session.add(releve)
        db.session.commit()
        flash("Relevé enregistré.", "success")
        return redirect(url_for("lots.detail", lot_id=compteur.lot.public_id))
    dernier = (
        Releve.query_actifs()
        .filter_by(compteur_id=compteur.id)
        .order_by(Releve.date_releve.desc())
        .first()
    )
    unite = compteur.type_releve.unite if compteur.type_releve else ""
    return render_template(
        "compteurs/form_releve.html",
        compteur=compteur,
        dernier=dernier,
        unite=unite,
        copropriete=copropriete,
    )


@bp.route("/<uuid:compteur_id>/supprimer", methods=["POST"])
@login_required
@copropriete_required
def supprimer_compteur(copropriete, compteur_id):
    compteur = (
        Compteur.query_actifs()
        .join(Lot)
        .filter(
            Compteur.public_id == public_id_str(compteur_id),
            Lot.copropriete_id == copropriete.id,
        )
        .first_or_404()
    )
    compteur.actif = False
    compteur.date_fin = parse_date(request.form.get("date_fin", ""), default_today=True)
    compteur.marquer_supprime()
    db.session.commit()
    flash("Point de relevé supprimé.", "info")
    return redirect(url_for("lots.detail", lot_id=compteur.lot.public_id))


@bp.route("/releve/<uuid:releve_id>/supprimer", methods=["POST"])
@login_required
@copropriete_required
def supprimer_releve(copropriete, releve_id):
    releve = (
        Releve.query_actifs()
        .join(Compteur)
        .join(Lot)
        .filter(
            Releve.public_id == public_id_str(releve_id),
            Lot.copropriete_id == copropriete.id,
        )
        .first_or_404()
    )
    releve.marquer_supprime()
    db.session.commit()
    flash("Relevé supprimé.", "info")
    return redirect(url_for("lots.detail", lot_id=releve.compteur.lot.public_id))
