from extensions import  db
from models.factory_structure_model import Machine, ParameterValue, Parameter
from models.incident_model import IncidentAnalysisModel, IncidentModel
from models.dashboard_model import Dashboard, DashboardWidget
# -----------------------------------------------------------------------------------------------------------------------
def remove_all_machines_and_parms():
    db.session.query(DashboardWidget).delete()
    db.session.query(Dashboard).delete()

    db.session.query(IncidentModel).delete()
    db.session.query(IncidentAnalysisModel).delete()
    db.session.query(ParameterValue).delete()
    db.session.query(Parameter).delete()
    db.session.query(Machine).delete()
    



def seed_ring_spinning_machine():
    from models.factory_structure_model import Machine, Parameter, ParameterDomain
    from datetime import datetime
    """ایجاد ماشین ریسندگی حلقوی به همراه پارامترهای اصلی"""

    machine_name = "ring-spinning-01"

    existing_machine = Machine.query.filter_by(name=machine_name).first()
    if existing_machine:
        print("Ring Spinning machine already exists, skipping seed...")
        return

    # metadata پیشنهادی
    meta = {
        "manufacturer": "Generic Textile Machines Co.",
        "model_number": "RS-1000",
        "serial_number": "RSX-0001",
        "location": "Spinning Hall - Line 1",
        "install_date": "2024-01-01",
        "rated_capacity": 1000,
        "tags": ["spinning", "ring-spinning", "yarn"],
        "notes": "Default machine seeded for yarn quality monitoring"
    }

    machine = Machine(
        name=machine_name,
        display_name="Ring Spinning Machine",
        machine_type="Ring Spinning Machine",
        status="running",
        location="Spinning Hall",
        meta=meta
    )

    db.session.add(machine)
    db.session.flush()

    dashboard = Dashboard(
        user_id=1,
        name=machine.name,
        is_favorite=False
    )

    db.session.add(dashboard)
    db.session.flush()

    parameters = [

        Parameter(
            machine_id=machine.id,
            name="u_percent",
            tag="U_percent",
            display_name="Yarn Evenness",
            data_type="float",
            unit="percent",
            domain=ParameterDomain.QUALITY,
            min_value=80,
            max_value=90,
            description="Yarn evenness percentage"
        ),

        Parameter(
            machine_id=machine.id,
            name="breakage_rate_ring_spining",
            tag="breakage_rate_ring_spining",
            display_name="Yarn Breakage Rate",
            data_type="float",
            unit=None,
            domain=ParameterDomain.QUALITY,
            min_value=-1,
            max_value=25,
            description="Yarn breakage rate during spinning"
        ),

        Parameter(
            machine_id=machine.id,
            name="ipi_total",
            tag="IPI_total",
            display_name="Total Yarn Imperfections (IPI)",
            data_type="float",
            unit=None,
            domain=ParameterDomain.QUALITY,
            min_value=-1,
            max_value=150,
            description="Total yarn imperfections including neps, thick places, and thin places"
        ),

        Parameter(
            machine_id=machine.id,
            name="energy_consumption",
            tag="Energy_kWh",
            display_name="Instant Energy Consumption",
            data_type="float",
            unit="kWh",
            domain=ParameterDomain.PRODUCTION,
            min_value=None,
            max_value=None,
            description="Instant machine energy consumption"
        )
    ]

    db.session.add_all(parameters)
    db.session.flush()

    for param in parameters:
        widget = DashboardWidget(
            dashboard_id=dashboard.id,
            machine_id=machine.id,
            parameter_id=param.id,
            widget_type="graph",
            title=param.display_name
        )

        db.session.add(widget)

    db.session.commit()

    print(f"{machine_name} machine and parameters seeded successfully")


def seed_air_jet_loom_machine2():
    from models.factory_structure_model import Machine, Parameter, ParameterDomain
    from datetime import datetime
    """ایجاد ماشین ریسندگی حلقوی به همراه پارامترهای اصلی"""

    machine_name = "Air-Jet Loom"

    existing_machine = Machine.query.filter_by(name=machine_name).first()
    if existing_machine:
        print("Ring Spinning machine already exists, skipping seed...")
        return

    # metadata پیشنهادی
    meta = {
        "width": "190 cm",
    }

    machine = Machine(
        name=machine_name,
        display_name="Air-Jet Loom",
        machine_type="Air-Jet Loom",
        status="running",
        location="Loom Hall",
        meta=meta
    )

    db.session.add(machine)
    db.session.flush()  # گرفتن id قبل از commit

    dashboard = Dashboard(
        user_id=1,
        name=machine.name,
        is_favorite=False
    )

    db.session.add(dashboard)
    db.session.flush()

    parameters = [

       Parameter(
        machine_id=machine.id,
        name="Loom_Speed_PPM",
        tag="Loom_Speed_PPM",
        display_name="Loom Speed PPM",
        data_type="float",
        unit="PPM",
        domain=ParameterDomain.PRODUCTION,
        min_value=680,
        max_value=710,
        description="Loom operating speed in picks per minute"
        ),

        Parameter(
            machine_id=machine.id,
            name="Warp_Tension_Avg_N",
            tag="Warp_Tension_Avg_N",
            display_name="Warp Tension Average",
            data_type="float",
            unit="N",
            domain=ParameterDomain.PRODUCTION,
            min_value=180,
            max_value=220,
            description="Average warp yarn tension"
        ),

        Parameter(
            machine_id=machine.id,
            name="Weft_Insertion_Time_ms",
            tag="Weft_Insertion_Time_ms",
            display_name="Weft Insertion Time",
            data_type="float",
            unit="ms",
            domain=ParameterDomain.PRODUCTION,
            min_value=19,
            max_value=23,
            description="Time required for weft insertion"
        ),

        Parameter(
            machine_id=machine.id,
            name="End_Breakage_Rate",
            tag="End_Breakage_Rate",
            display_name="End Breakage Rate",
            data_type="float",
            unit="breaks/hour",
            domain=ParameterDomain.QUALITY,
            min_value=1.2,
            max_value=2.8,
            description="Warp end breakage rate per hour"
        ),

        Parameter(
            machine_id=machine.id,
            name="Power_Consumption_kW_air_jet",
            tag="Power_Consumption_kW_air_jet",
            display_name="Power Consumption air jet",
            data_type="float",
            unit="kW",
            domain=ParameterDomain.PRODUCTION,
            min_value=3.9,
            max_value=4.4,
            description="Electrical power consumption of the loom"
        ),

        Parameter(
            machine_id=machine.id,
            name="Air_Pressure_bar_jet_air",
            tag="Air_Pressure_bar_jet_air",
            display_name="Air Pressure",
            data_type="float",
            unit="bar",
            domain=ParameterDomain.PRODUCTION,
            min_value=4.8,
            max_value=5.4,
            description="Compressed air pressure supplied to the air-jet system"
        ),

        Parameter(
            machine_id=machine.id,
            name="Temperature_C_AIR_JET",
            tag="Temperature_C_AIR_JET",
            display_name="Temperature",
            data_type="float",
            unit="°C",
            domain=ParameterDomain.PRODUCTION,
            min_value=27,
            max_value=29.5,
            description="Ambient weaving room temperature"
        ),

        Parameter(
            machine_id=machine.id,
            name="RH_Percent_JET_LOOM",
            tag="RH_Percent_JET_LOOM",
            display_name="Relative Humidity",
            data_type="float",
            unit="%",
            domain=ParameterDomain.PRODUCTION,
            min_value=54,
            max_value=60,
            description="Ambient relative humidity in the weaving room"
        )
    ]

    db.session.add_all(parameters)
    db.session.flush()

    for param in parameters:
        widget = DashboardWidget(
            dashboard_id=dashboard.id,
            machine_id=machine.id,
            parameter_id=param.id,
            widget_type="graph",
            title=param.display_name
        )

        db.session.add(widget)

    db.session.commit()

    print(f"{machine_name} machine and parameters seeded successfully")

def single_jersey_circular_knitting_machine3():
    from models.factory_structure_model import Machine, Parameter, ParameterDomain
    from datetime import datetime
    """ایجاد ماشین ریسندگی حلقوی به همراه پارامترهای اصلی"""

    machine_name = "Single Jersey Circular Knitting Machine"

    existing_machine = Machine.query.filter_by(name=machine_name).first()
    if existing_machine:
        print("Single Jersey Circular Knitting Machine already exists, skipping seed...")
        return

    # machine metadata
    meta = {
        "diameter": "30 inch",
        "gauge": "28",
        "fabric_type": "Single Jersey",
        "fiber_content": "100% Cotton",
        "yarn_count": "Ne 30/1"
    }

    machine = Machine(
        name=machine_name,
        display_name="Single Jersey Circular Knitting Machine",
        machine_type="Circular Knitting Machine",
        status="running",
        location="Knitting Hall",
        meta=meta
    )

    db.session.add(machine)
    db.session.flush()  # گرفتن id قبل از commit

    dashboard = Dashboard(
        user_id=1,
        name=machine.name,
        is_favorite=False
    )

    db.session.add(dashboard)
    db.session.flush()

    parameters = [
        Parameter(
            machine_id=machine.id,
            name="Machine_Speed_RPM",
            tag="Machine_Speed_RPM",
            display_name="Machine Speed",
            data_type="float",
            unit="RPM",
            domain=ParameterDomain.PRODUCTION,
            min_value=24,
            max_value=26,
            description="Circular knitting machine rotational speed"
        ),

        Parameter(
            machine_id=machine.id,
            name="Yarn_Tension_cN",
            tag="Yarn_Tension_cN",
            display_name="Yarn Tension",
            data_type="float",
            unit="cN",
            domain=ParameterDomain.PRODUCTION,
            min_value=4.8,
            max_value=6.2,
            description="Average yarn feeding tension"
        ),

        Parameter(
            machine_id=machine.id,
            name="Needle_Breakage_Rate",
            tag="Needle_Breakage_Rate",
            display_name="Needle Breakage Rate",
            data_type="float",
            unit="breaks/hour",
            domain=ParameterDomain.QUALITY,
            min_value=0.2,
            max_value=0.8,
            description="Needle breakage occurrences per hour"
        ),

        Parameter(
            machine_id=machine.id,
            name="Stitch_Length_mm",
            tag="Stitch_Length_mm",
            display_name="Stitch Length",
            data_type="float",
            unit="mm",
            domain=ParameterDomain.QUALITY,
            min_value=2.8,
            max_value=3.1,
            description="Produced stitch length"
        ),

        Parameter(
            machine_id=machine.id,
            name="Power_Consumption_kW_jersey",
            tag="Power_Consumption_kW_jersey",
            display_name="Power Consumption single jersey",
            data_type="float",
            unit="kW",
            domain=ParameterDomain.PRODUCTION,
            min_value=5.8,
            max_value=6.5,
            description="Electrical power consumption of the knitting machine"
        ),

        Parameter(
            machine_id=machine.id,
            name="Knitting_Temperature_C",
            tag="Knitting_Temperature_C",
            display_name="Knitting Temperature",
            data_type="float",
            unit="°C",
            domain=ParameterDomain.PRODUCTION,
            min_value=26,
            max_value=29,
            description="Ambient temperature around the knitting machine"
        ),

        Parameter(
            machine_id=machine.id,
            name="RH_Percent_SINGLE_JERSEY",
            tag="RH_Percent_SINGLE_JERSEY",
            display_name="Relative Humidity",
            data_type="float",
            unit="%",
            domain=ParameterDomain.PRODUCTION,
            min_value=55,
            max_value=62,
            description="Ambient relative humidity in the knitting area"
        ),
    ]

    db.session.add_all(parameters)
    db.session.flush()

    for param in parameters:
        widget = DashboardWidget(
            dashboard_id=dashboard.id,
            machine_id=machine.id,
            parameter_id=param.id,
            widget_type="graph",
            title=param.display_name
        )

        db.session.add(widget)

    db.session.commit()

    print(f"{machine_name} machine and parameters seeded successfully")




def high_tenoerature_jet_dyeing_machine4():
    from models.factory_structure_model import Machine, Parameter, ParameterDomain
    from datetime import datetime
    """ایجاد ماشین ریسندگی حلقوی به همراه پارامترهای اصلی"""

    machine_name = "High-Temperature Jet Dyeing Machine"

    existing_machine = Machine.query.filter_by(name=machine_name).first()
    if existing_machine:
        print("High-Temperature Jet Dyeing Machine already exists, skipping seed...")
        return

    meta = {
        "machine_category": "Dyeing",
        "machine_type_detail": "Soft-Flow / Overflow Jet",
        "batch_capacity_kg": "150-250",
        "fabric_type": "Knitted Fabric",
        "fiber_content": "100% Polyester",
        "dye_class": "Disperse Dyes",
        "process_type": "High Temperature Dyeing",
        "target_temperature_c": 132
    }

    machine = Machine(
        name=machine_name,
        display_name="High-Temperature Jet Dyeing Machine",
        machine_type="Jet Dyeing Machine",
        status="running",
        location="Dyeing Hall",
        meta=meta
    )

    db.session.add(machine)
    db.session.flush()  # گرفتن id قبل از commit

    dashboard = Dashboard(
        user_id=1,
        name=machine.name,
        is_favorite=False
    )

    db.session.add(dashboard)
    db.session.flush()

    parameters = [
        Parameter(
            machine_id=machine.id,
            name="Temperature_C_jet_deying",
            tag="Temperature_C_jet_deying",
            display_name="Dye Bath Temperature",
            data_type="float",
            unit="°C",
            domain=ParameterDomain.PRODUCTION,
            min_value=131.5,
            max_value=133.0,
            description="Dye bath temperature during polyester dyeing process"
        ),

        Parameter(
            machine_id=machine.id,
            name="Steam_Pressure",
            tag="Steam_Pressure_bar",
            display_name="Steam Pressure",
            data_type="float",
            unit="bar",
            domain=ParameterDomain.PRODUCTION,
            min_value=4.8,
            max_value=5.5,
            description="Steam pressure supplied to the heat exchanger"
        ),

        Parameter(
            machine_id=machine.id,
            name="Pump_Pressure",
            tag="Pump_Pressure_bar",
            display_name="Pump Pressure",
            data_type="float",
            unit="bar",
            domain=ParameterDomain.PRODUCTION,
            min_value=2.2,
            max_value=3.1,
            description="Liquor circulation pump pressure"
        ),

        Parameter(
            machine_id=machine.id,
            name="Fabric_Speed",
            tag="Fabric_Speed_m_min",
            display_name="Fabric Speed",
            data_type="float",
            unit="m/min",
            domain=ParameterDomain.PRODUCTION,
            min_value=280,
            max_value=340,
            description="Fabric circulation speed through the jet nozzle"
        ),

        Parameter(
            machine_id=machine.id,
            name="Liquor_Ratio",
            tag="Liquor_Ratio",
            display_name="Liquor Ratio",
            data_type="float",
            unit="1:x",
            domain=ParameterDomain.PRODUCTION,
            min_value=6.5,
            max_value=8.5,
            description="Ratio of dye liquor volume to fabric weight"
        ),

        Parameter(
            machine_id=machine.id,
            name="Energy_Consumption_kW",
            tag="Energy_Consumption_kW",
            display_name="Energy Consumption",
            data_type="float",
            unit="kW",
            domain=ParameterDomain.PRODUCTION,
            min_value=42,
            max_value=52,
            description="Total electrical power consumption including pumps and heating system"
        ),
    ]

    db.session.add_all(parameters)
    db.session.flush()

    for param in parameters:
        widget = DashboardWidget(
            dashboard_id=dashboard.id,
            machine_id=machine.id,
            parameter_id=param.id,
            widget_type="graph",
            title=param.display_name
        )

        db.session.add(widget)

    db.session.commit()
    

    print(f"{machine_name} machine and parameters seeded successfully")

def gas_fired_stenter5():
    from models.factory_structure_model import Machine, Parameter, ParameterDomain
    from datetime import datetime
    """ایجاد ماشین ریسندگی حلقوی به همراه پارامترهای اصلی"""

    machine_name = "Gas-Fired Stenter"

    existing_machine = Machine.query.filter_by(name=machine_name).first()
    if existing_machine:
        print("Gas-Fired Stenter already exists, skipping seed...")
        return

    meta = {
        "machine_category": "Finishing",
        "machine_type_detail": "Gas-Fired Stenter",
        "zones": "8-10",
        "working_width_cm": "220-280",
        "fabric_type": "Knitted Fabric",
        "supported_fabrics": [
            "100% Cotton Single Jersey",
            "Cotton/Poly Blend"
        ],
        "processes": [
            "Drying",
            "Heat Setting"
        ],
        "target_zone_temperature_c": 165
    }

    machine = Machine(
        name=machine_name,
        display_name="Gas-Fired Stenter",
        machine_type="Stenter Machine",
        status="running",
        location="Finishing Hall",
        meta=meta
    )

    db.session.add(machine)
    db.session.flush()  # گرفتن id قبل از commit

    dashboard = Dashboard(
        user_id=1,
        name=machine.name,
        is_favorite=False
    )

    db.session.add(dashboard)
    db.session.flush()

    parameters = [
        Parameter(
            machine_id=machine.id,
            name="Zone_Temperature_C",
            tag="Zone_Temperature_C",
            display_name="Zone Temperature",
            data_type="float",
            unit="°C",
            domain=ParameterDomain.PRODUCTION,
            min_value=162,
            max_value=168,
            description="Temperature of the affected stenter zone"
        ),

        Parameter(
            machine_id=machine.id,
            name="Fan_RPM",
            tag="Fan_RPM",
            display_name="Fan Speed",
            data_type="float",
            unit="RPM",
            domain=ParameterDomain.PRODUCTION,
            min_value=1050,
            max_value=1250,
            description="Circulation fan rotational speed in the stenter zone"
        ),

        Parameter(
            machine_id=machine.id,
            name="Fabric_Moisture",
            tag="Fabric_Moisture_percent",
            display_name="Fabric Moisture",
            data_type="float",
            unit="%",
            domain=ParameterDomain.QUALITY,
            min_value=4.5,
            max_value=7.5,
            description="Final fabric moisture content at machine outlet"
        ),

        Parameter(
            machine_id=machine.id,
            name="Chain_Speed",
            tag="Chain_Speed_m_min",
            display_name="Chain Speed",
            data_type="float",
            unit="m/min",
            domain=ParameterDomain.PRODUCTION,
            min_value=28,
            max_value=36,
            description="Stenter chain speed transporting the fabric"
        ),

        Parameter(
            machine_id=machine.id,
            name="Gas_Consumption",
            tag="Gas_Consumption_m3_h",
            display_name="Gas Consumption",
            data_type="float",
            unit="m³/h",
            domain=ParameterDomain.PRODUCTION,
            min_value=85,
            max_value=110,
            description="Total natural gas consumption of the stenter"
        ),

        Parameter(
            machine_id=machine.id,
            name="Exhaust_Humidity",
            tag="Exhaust_Humidity_percent",
            display_name="Exhaust Humidity",
            data_type="float",
            unit="%",
            domain=ParameterDomain.PRODUCTION,
            min_value=35,
            max_value=48,
            description="Humidity level of exhaust air leaving the stenter"
        ),
    ]

    db.session.add_all(parameters)
    db.session.flush()

    for param in parameters:
        widget = DashboardWidget(
            dashboard_id=dashboard.id,
            machine_id=machine.id,
            parameter_id=param.id,
            widget_type="graph",
            title=param.display_name
        )

        db.session.add(widget)

    db.session.commit()

    print(f"{machine_name} machine and parameters seeded successfully")




def auto_seeds():
    remove_all_machines_and_parms()
    seed_ring_spinning_machine()
    seed_air_jet_loom_machine2()
    single_jersey_circular_knitting_machine3()
    high_tenoerature_jet_dyeing_machine4()
    gas_fired_stenter5()

if __name__ == "__main__":
    from app import create_app
    app = create_app()
    with app.app_context():
        auto_seeds()
