"""Service métier unique pour créer des équipements.

Les formulaires historiques (fiche avancée et wizard) délèguent ici la
construction de l'objet. Le lot reste facultatif : un inventaire incomplet est
valide et pourra être complété plus tard.
"""
from datetime import date

from ...extensions import db
from ..models.equipment import Equipment


def create_equipment(*, name, category_id=None, lot_id=None, room_id=None,
                     quantity=1, is_group=False, parent_id=None, room_profile_item_id=None,
                     tracked_individually=False, mobility="non_precise",
                     status="en_service", code=None, description=None,
                     management_mode=None, serial_number=None,
                     manufacturer=None, model_reference=None,
                     supplier_id=None, supplier_reference=None,
                     purchase_price=None, purchase_date=None,
                     recurrence_monitoring=False, position=None,
                     individual_number=None, create_schedule=True):
    """Construit, ajoute et flush un équipement sans recherche par nom.

    Retourne l'instance persistable et son identifiant est disponible dès le
    retour. La génération préventive est déclenchée uniquement si un lot est
    effectivement renseigné.
    """
    name = (name or "").strip()
    if not name:
        raise ValueError("Le nom de l'équipement est obligatoire.")
    quantity = int(quantity or 1)
    if quantity < 1:
        raise ValueError("La quantité doit être positive.")
    equipment = Equipment(
        name=name, category_id=category_id or None, lot_id=lot_id or None,
        room_id=room_id or None, quantity=quantity, is_group=bool(is_group),
        parent_id=parent_id or None, room_profile_item_id=room_profile_item_id or None,
        tracked_individually=bool(tracked_individually), mobility=mobility or "non_precise",
        status=status or "en_service", code=code or None,
        description=description or None, management_mode=management_mode or None,
        serial_number=serial_number or None, manufacturer=manufacturer or None,
        model_reference=model_reference or None, supplier_id=supplier_id or None,
        supplier_reference=supplier_reference or None, purchase_price=purchase_price or None,
        purchase_date=purchase_date, recurrence_monitoring=bool(recurrence_monitoring),
        position=position or None, individual_number=individual_number,
    )
    db.session.add(equipment)
    db.session.flush()
    if create_schedule and equipment.lot_id:
        equipment.create_scheduled_tasks_from_lot(commit=False)
    return equipment
