"""Shared fixtures for Mantara tests."""

import sys
from pathlib import Path

import pytest

# Ensure v1/ is on the import path
sys.path.insert(0, str(Path(__file__).parent.parent))

from models import (
    MantaraSchema, Menu, Submenu, Table, Column, ForeignKey, EnumType,
)


@pytest.fixture
def ams_schema():
    """The known-good Agricultural Management System schema.

    Realistic AMS with 3 menus, 8 submenus, 9 tables — each table has at
    least 5 business columns.  Passes all 13 validators.
    """
    return MantaraSchema(
        system_name="Agricultural Management System",
        schema_name="ams",
        description="Comprehensive platform for managing farm operations.",
        menus=[
            # ── Menu 1: Dashboard ─────────────────────────────────────
            Menu(
                menu_id=1,
                menu_name="Dashboard",
                sequence_number=1,
                description="Centralized overview of the farm.",
                submenus=[
                    Submenu(
                        submenu_id=101,
                        submenu_name="Farm Overview",
                        sequence_number=1,
                        description="High-level summary of farm activities.",
                        tables=[
                            Table(
                                table_name="farm_overview",
                                comment="Aggregated dashboard view of farm metrics including land usage.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 101 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="farm_id", type="INT", constraints="NOT NULL REFERENCES ams.farms(id)"),
                                    Column(name="total_hectares", type="FLOAT", constraints="NOT NULL"),
                                    Column(name="current_season", type="ams.season_enum"),
                                    Column(name="active_plots", type="INT", constraints="NOT NULL DEFAULT 0"),
                                    Column(name="notes", type="TEXT"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                    Column(name="updated_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                                foreign_keys=[
                                    ForeignKey(column="farm_id", references="ams.farms(id)"),
                                ],
                            ),
                        ],
                    ),
                    Submenu(
                        submenu_id=102,
                        submenu_name="Weather Tracking",
                        sequence_number=2,
                        description="Weather observations and forecasts for farm planning.",
                        tables=[
                            Table(
                                table_name="weather_observations",
                                comment="Daily weather observations captured at the farm.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 102 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="farm_id", type="INT", constraints="NOT NULL REFERENCES ams.farms(id)"),
                                    Column(name="observation_date", type="DATE", constraints="NOT NULL"),
                                    Column(name="temperature_high", type="FLOAT"),
                                    Column(name="temperature_low", type="FLOAT"),
                                    Column(name="rainfall_mm", type="FLOAT"),
                                    Column(name="wind_speed_kmh", type="FLOAT"),
                                    Column(name="notes", type="TEXT"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                                foreign_keys=[
                                    ForeignKey(column="farm_id", references="ams.farms(id)"),
                                ],
                            ),
                        ],
                    ),
                ],
            ),
            # ── Menu 2: Crop Management ───────────────────────────────
            Menu(
                menu_id=2,
                menu_name="Crop Management",
                sequence_number=2,
                description="Manage crops from planting to harvest.",
                submenus=[
                    Submenu(
                        submenu_id=201,
                        submenu_name="Crop Registry",
                        sequence_number=1,
                        description="Master list of all crops.",
                        tables=[
                            Table(
                                table_name="crops",
                                comment="Master registry of crop types and varieties available for planting.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 201 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="crop_name", type="VARCHAR(255)", constraints="NOT NULL"),
                                    Column(name="crop_category", type="ams.crop_category_enum", constraints="NOT NULL"),
                                    Column(name="growth_duration_days", type="INT"),
                                    Column(name="optimal_temperature", type="FLOAT"),
                                    Column(name="water_requirement_mm", type="FLOAT"),
                                    Column(name="is_active", type="BOOLEAN", constraints="DEFAULT TRUE"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                            ),
                        ],
                    ),
                    Submenu(
                        submenu_id=202,
                        submenu_name="Planting Plans",
                        sequence_number=2,
                        description="Schedule crop planting.",
                        tables=[
                            Table(
                                table_name="planting_plans",
                                comment="Records each planting event linking a crop to a specific plot.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 202 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="crop_id", type="INT", constraints="NOT NULL REFERENCES ams.crops(id)"),
                                    Column(name="farm_id", type="INT", constraints="NOT NULL REFERENCES ams.farms(id)"),
                                    Column(name="planned_date", type="DATE", constraints="NOT NULL"),
                                    Column(name="expected_harvest_date", type="DATE"),
                                    Column(name="plot_area_hectares", type="FLOAT", constraints="NOT NULL"),
                                    Column(name="planting_status", type="ams.activity_status_enum", constraints="NOT NULL DEFAULT 'planned'"),
                                    Column(name="notes", type="TEXT"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                                foreign_keys=[
                                    ForeignKey(column="crop_id", references="ams.crops(id)"),
                                    ForeignKey(column="farm_id", references="ams.farms(id)"),
                                ],
                            ),
                        ],
                    ),
                    Submenu(
                        submenu_id=203,
                        submenu_name="Harvest Records",
                        sequence_number=3,
                        description="Track harvest outcomes and yields.",
                        tables=[
                            Table(
                                table_name="harvest_records",
                                comment="Records actual harvest data for each planting plan.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 203 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="planting_plan_id", type="INT", constraints="NOT NULL REFERENCES ams.planting_plans(id)"),
                                    Column(name="harvest_date", type="DATE", constraints="NOT NULL"),
                                    Column(name="yield_kg", type="FLOAT", constraints="NOT NULL"),
                                    Column(name="harvest_quality", type="ams.quality_grade_enum"),
                                    Column(name="loss_percentage", type="FLOAT"),
                                    Column(name="notes", type="TEXT"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                                foreign_keys=[
                                    ForeignKey(column="planting_plan_id", references="ams.planting_plans(id)"),
                                ],
                            ),
                        ],
                    ),
                ],
            ),
            # ── Menu 3: Settings ──────────────────────────────────────
            Menu(
                menu_id=3,
                menu_name="Settings",
                sequence_number=3,
                description="System configuration and master data.",
                submenus=[
                    Submenu(
                        submenu_id=301,
                        submenu_name="Farm Configuration",
                        sequence_number=1,
                        description="Define farm details.",
                        tables=[
                            Table(
                                table_name="farms",
                                comment="Core farm entity with location, size, and configuration details.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 301 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="farm_name", type="VARCHAR(255)", constraints="NOT NULL"),
                                    Column(name="total_hectares", type="FLOAT", constraints="NOT NULL"),
                                    Column(name="region", type="VARCHAR(255)"),
                                    Column(name="soil_composition", type="VARCHAR(255)"),
                                    Column(name="latitude", type="FLOAT"),
                                    Column(name="longitude", type="FLOAT"),
                                    Column(name="is_active", type="BOOLEAN", constraints="DEFAULT TRUE"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                            ),
                        ],
                    ),
                    Submenu(
                        submenu_id=302,
                        submenu_name="Equipment Registry",
                        sequence_number=2,
                        description="Track farm equipment and machinery.",
                        tables=[
                            Table(
                                table_name="equipment",
                                comment="Farm equipment and machinery inventory.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 302 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="equipment_name", type="VARCHAR(255)", constraints="NOT NULL"),
                                    Column(name="equipment_category", type="ams.equipment_category_enum", constraints="NOT NULL"),
                                    Column(name="manufacturer", type="VARCHAR(255)"),
                                    Column(name="serial_number", type="VARCHAR(100)"),
                                    Column(name="purchase_date", type="DATE"),
                                    Column(name="is_operational", type="BOOLEAN", constraints="DEFAULT TRUE"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                            ),
                        ],
                    ),
                    Submenu(
                        submenu_id=303,
                        submenu_name="Worker Management",
                        sequence_number=3,
                        description="Manage farm workers and assignments.",
                        tables=[
                            Table(
                                table_name="workers",
                                comment="Farm workers and laborers registry.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 303 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="first_name", type="VARCHAR(255)", constraints="NOT NULL"),
                                    Column(name="last_name", type="VARCHAR(255)", constraints="NOT NULL"),
                                    Column(name="phone_number", type="VARCHAR(20)"),
                                    Column(name="hire_date", type="DATE", constraints="NOT NULL"),
                                    Column(name="worker_role", type="ams.worker_role_enum", constraints="NOT NULL"),
                                    Column(name="is_active", type="BOOLEAN", constraints="DEFAULT TRUE"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                            ),
                            Table(
                                table_name="worker_assignments",
                                comment="Assignment of workers to specific planting plans or tasks.",
                                columns=[
                                    Column(name="id", type="SERIAL", constraints="PRIMARY KEY"),
                                    Column(name="submenu_id", type="INT", constraints="DEFAULT 303 NOT NULL REFERENCES ams.submenu(submenu_id)"),
                                    Column(name="worker_id", type="INT", constraints="NOT NULL REFERENCES ams.workers(id)"),
                                    Column(name="planting_plan_id", type="INT", constraints="REFERENCES ams.planting_plans(id)"),
                                    Column(name="assignment_date", type="DATE", constraints="NOT NULL"),
                                    Column(name="end_date", type="DATE"),
                                    Column(name="assignment_status", type="ams.activity_status_enum", constraints="NOT NULL DEFAULT 'planned'"),
                                    Column(name="notes", type="TEXT"),
                                    Column(name="created_at", type="TIMESTAMP", constraints="DEFAULT CURRENT_TIMESTAMP"),
                                ],
                                foreign_keys=[
                                    ForeignKey(column="worker_id", references="ams.workers(id)"),
                                    ForeignKey(column="planting_plan_id", references="ams.planting_plans(id)"),
                                ],
                            ),
                        ],
                    ),
                ],
            ),
        ],
        enum_types=[
            EnumType(type_name="ams.season_enum", values=["kharif", "rabi", "zaid", "annual"], description="Indian agricultural seasons"),
            EnumType(type_name="ams.crop_category_enum", values=["cereal", "pulse", "oilseed", "vegetable", "fruit"], description="Crop categories"),
            EnumType(type_name="ams.activity_status_enum", values=["planned", "in_progress", "completed", "cancelled"], description="Activity status"),
            EnumType(type_name="ams.quality_grade_enum", values=["premium", "standard", "below_standard", "rejected"], description="Harvest quality grades"),
            EnumType(type_name="ams.equipment_category_enum", values=["tractor", "harvester", "irrigation", "plough", "sprayer", "other"], description="Equipment categories"),
            EnumType(type_name="ams.worker_role_enum", values=["field_worker", "supervisor", "driver", "irrigation_specialist", "general"], description="Worker roles"),
        ],
    )
