def update(id:int):
    company_id = session["user"]["company_id"]
    if not db.is_existing(table="users", conditions={"id":id, "type":"driver", "company_id": company_id}):
        return jsonify(info="Driver not found"), 404

    driver = request.get_json(force=True)
    driver = Driver.parse(driver, "update")
    
    if "errors" in driver:
        return jsonify(errors=driver["errors"]),400
    driver = driver["driver"]
    driver_data = {}

    if "name" in driver:
        if db.is_existing(table="users",
                      conditions={"name": driver["name"], "type":"driver", "company_id": company_id}):
            return jsonify(info="Driver with the same name already exist"),400
        driver_data["name"] = driver["name"]

    if "email" in driver:
        if db.is_existing(table="users",
                      conditions={"email": driver["email"], "type":"driver", "company_id": company_id}):
            return jsonify(info="Driver with the same email already exist"),400
        driver_data["email"] = driver["email"]

    if "phone" in driver:
        driver_data["phone"] = driver["phone"]

    db.update(table="users", params=driver_data, conditions={"id": id})
    return jsonify(info="Driver updated successfully"),200
def create():
    company_id = session["user"]["company_id"]
    driver = request.get_json(force=True)
    driver = Driver.parse(driver, "create")
    
    if "errors" in driver:
        return jsonify(errors=driver["errors"]),400
    driver = driver["driver"]

    if db.is_existing(table="users",
                      conditions={"name": driver["name"], "type":"driver", "company_id":company_id}):
        return jsonify(info="Driver with the same name already exist"),400

    if db.is_existing(table="users",
                      conditions={"email": driver["email"], "type":"driver", "company_id": company_id}):
            return jsonify(info="Driver with the same email already exist"),400

    pwd = Generator.password()

    driver_data={
        "name" : driver["name"],
        "email" : driver["email"],
        "password" : generate_password_hash(pwd),
        "company_id" : company_id,
        "phone" : driver["phone"],
        "type":"driver"
    }
    driverId = db.insert(table="users", params=driver_data)
    return jsonify(info="Driver created successfully", driverId=driverId, password=pwd),200
def is_assignable(driver:Driver, delivery:Delivery):
    vehicles= driver.get_vehicles()
    value = True
    for v in vehicles:
        value = value and (v.get_free_area() >= delivery.get_area()) and (v.get_free_weight() >= delivery.get_weight())

    return False if len(vehicles)== 0 else value
def set_vehicle(driver_id:int):

    def reset_vehicle(index, driver_id):
        _sql = """
                  UPDATE vehicles
                  SET vehicles.driver_id = NULL
                  WHERE vehicles.id = (
                    SELECT users.vehicle_id_""" + str(index) +"""
                    FROM users
                    WHERE users.id = %(id)s );
                """
        db.query(_sql, params={"id" : driver_id}, fetch=False)


    company_id = session["user"]["company_id"]
    if not db.is_existing(table="users",conditions={"id":driver_id, "type":"driver", "company_id": company_id}):
        return jsonify(info="Driver not found"), 404

    vehicles = request.get_json(force=True)
    vehicles = Driver.parse(vehicles, "set_vehicle")

    if "errors" in vehicles:
        return jsonify(errors=vehicles["errors"]),400

    vehicles = vehicles["vehicles"]

    for k,v in vehicles.items():

        if v is not None:

            if not db.is_existing(table="vehicles", conditions={"company_id": company_id, "id":v}):
                return jsonify(info="Vehicle " + str(k) + " not found"), 404

            _sql = """ SELECT 1 FROM vehicles WHERE company_id=%(company_id)s AND id= %(v_id)s AND (driver_id IS NULL OR driver_id=%(id)s); """

            # if wished vehicle is available
            if db.query(_sql,params={"company_id" : company_id, "id": driver_id, "v_id" : v}, multiple=False) is not None:

                # reset old vehicle
                reset_vehicle(k[1], driver_id)

                # update vehicle
                db.update(table="vehicles", params={"driver_id": driver_id}, conditions={"id":v})

            else :
                return jsonify(info="Vehicle " + str(k) + " already taken"), 400

        else :
            # reset old vehicle
            reset_vehicle(k[1], driver_id)

        # update user
        db.update(table="users", params={"vehicle_id_"+k[1]: v}, conditions={"id" : driver_id})

    return jsonify(info="Vehicles set successfully"), 200
def append_suggestion(suggestions:list, driver:Driver, delivery):
    found = False
    for sup in suggestions:
        if "driver" in sup and sup["driver"].get_id() == driver.get_id():
            if not "deliveries" in sup:
                sup["deliveries"] = []
            sup["deliveries"].append(delivery)
            found=True
            break
    if found is False:
        suggestions.append({"driver" : driver, "deliveries":[delivery]})