""" Offline data pack for sovereign operation. 500+ Indian districts with weather norms, soil types, water quality baselines. Zero API calls needed when offline. """ import json import os # Comprehensive Indian districts database # Format: { 'district_name': { soil, crops, avg_temp, avg_rainfall, water_baseline } } INDIAN_DISTRICTS = { # Assam 'cachar': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Sugarcane', 'Jute'], 'avg_temp': 26, 'avg_rainfall': 2800, 'water_ph_norm': 6.8, 'water_tds_norm': 150}, 'karimganj': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Mustard', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 3000, 'water_ph_norm': 6.7, 'water_tds_norm': 140}, 'hailakandi': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Tea', 'Betel Nut'], 'avg_temp': 26, 'avg_rainfall': 2900, 'water_ph_norm': 6.8, 'water_tds_norm': 145}, 'kamrup': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Mustard', 'Vegetables'], 'avg_temp': 25, 'avg_rainfall': 1800, 'water_ph_norm': 7.0, 'water_tds_norm': 160}, 'jorhat': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Horticulture'], 'avg_temp': 24, 'avg_rainfall': 2200, 'water_ph_norm': 6.5, 'water_tds_norm': 130}, 'dibrugarh': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Oilseeds'], 'avg_temp': 24, 'avg_rainfall': 2600, 'water_ph_norm': 6.6, 'water_tds_norm': 135}, 'tinsukia': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Tea', 'Rice', 'Citrus'], 'avg_temp': 24, 'avg_rainfall': 2500, 'water_ph_norm': 6.7, 'water_tds_norm': 140}, 'sivasagar': {'state': 'Assam', 'soil': 'Alluvial', 'crops': ['Rice', 'Tea', 'Oilseeds'], 'avg_temp': 25, 'avg_rainfall': 2400, 'water_ph_norm': 6.8, 'water_tds_norm': 145}, # Bihar 'patna': {'state': 'Bihar', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Maize'], 'avg_temp': 27, 'avg_rainfall': 1100, 'water_ph_norm': 7.2, 'water_tds_norm': 300}, 'gaya': {'state': 'Bihar', 'soil': 'Red Sandy', 'crops': ['Wheat', 'Pulses', 'Millets'], 'avg_temp': 28, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 350}, 'muzaffarpur': {'state': 'Bihar', 'soil': 'Alluvial', 'crops': ['Litchi', 'Rice', 'Wheat'], 'avg_temp': 26, 'avg_rainfall': 1200, 'water_ph_norm': 7.0, 'water_tds_norm': 280}, # Uttar Pradesh 'varanasi': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Sugarcane'], 'avg_temp': 27, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 400}, 'lucknow': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Mango'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.3, 'water_tds_norm': 380}, 'gorakhpur': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Sugarcane'], 'avg_temp': 26, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 350}, 'allahabad': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Guava'], 'avg_temp': 28, 'avg_rainfall': 950, 'water_ph_norm': 7.4, 'water_tds_norm': 390}, 'agra': {'state': 'Uttar Pradesh', 'soil': 'Alluvial', 'crops': ['Wheat', 'Potato', 'Mustard'], 'avg_temp': 30, 'avg_rainfall': 700, 'water_ph_norm': 7.8, 'water_tds_norm': 500}, # Punjab 'amritsar': {'state': 'Punjab', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Cotton'], 'avg_temp': 25, 'avg_rainfall': 700, 'water_ph_norm': 7.5, 'water_tds_norm': 350}, 'ludhiana': {'state': 'Punjab', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Vegetables'], 'avg_temp': 25, 'avg_rainfall': 650, 'water_ph_norm': 7.4, 'water_tds_norm': 340}, # West Bengal 'kolkata': {'state': 'West Bengal', 'soil': 'Alluvial', 'crops': ['Rice', 'Jute', 'Vegetables'], 'avg_temp': 28, 'avg_rainfall': 1600, 'water_ph_norm': 7.0, 'water_tds_norm': 250}, 'darjeeling': {'state': 'West Bengal', 'soil': 'Mountain', 'crops': ['Tea', 'Orange', 'Cardamom'], 'avg_temp': 15, 'avg_rainfall': 3000, 'water_ph_norm': 6.5, 'water_tds_norm': 80}, 'sundarbans': {'state': 'West Bengal', 'soil': 'Saline', 'crops': ['Rice', 'Coconut', 'Betel'], 'avg_temp': 28, 'avg_rainfall': 1800, 'water_ph_norm': 8.0, 'water_tds_norm': 600}, # Tamil Nadu 'chennai': {'state': 'Tamil Nadu', 'soil': 'Red Sandy', 'crops': ['Rice', 'Groundnut', 'Sugarcane'], 'avg_temp': 32, 'avg_rainfall': 1400, 'water_ph_norm': 7.2, 'water_tds_norm': 450}, 'coimbatore': {'state': 'Tamil Nadu', 'soil': 'Red', 'crops': ['Cotton', 'Millets', 'Coconut'], 'avg_temp': 28, 'avg_rainfall': 700, 'water_ph_norm': 7.5, 'water_tds_norm': 500}, 'madurai': {'state': 'Tamil Nadu', 'soil': 'Black', 'crops': ['Cotton', 'Rice', 'Jasmine'], 'avg_temp': 32, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 550}, # Karnataka 'bengaluru': {'state': 'Karnataka', 'soil': 'Red', 'crops': ['Ragi', 'Rice', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.0, 'water_tds_norm': 300}, 'mysuru': {'state': 'Karnataka', 'soil': 'Red', 'crops': ['Sugarcane', 'Rice', 'Sandalwood'], 'avg_temp': 26, 'avg_rainfall': 800, 'water_ph_norm': 7.0, 'water_tds_norm': 280}, # Maharashtra 'mumbai': {'state': 'Maharashtra', 'soil': 'Laterite', 'crops': ['Rice', 'Coconut', 'Mango'], 'avg_temp': 28, 'avg_rainfall': 2200, 'water_ph_norm': 7.0, 'water_tds_norm': 200}, 'pune': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Sugarcane', 'Jowar', 'Grapes'], 'avg_temp': 26, 'avg_rainfall': 700, 'water_ph_norm': 7.3, 'water_tds_norm': 350}, 'nagpur': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Cotton', 'Orange', 'Soybean'], 'avg_temp': 30, 'avg_rainfall': 1100, 'water_ph_norm': 7.5, 'water_tds_norm': 400}, 'aurangabad': {'state': 'Maharashtra', 'soil': 'Black', 'crops': ['Cotton', 'Jowar', 'Bajra'], 'avg_temp': 30, 'avg_rainfall': 700, 'water_ph_norm': 7.8, 'water_tds_norm': 500}, # Gujarat 'ahmedabad': {'state': 'Gujarat', 'soil': 'Alluvial', 'crops': ['Cotton', 'Groundnut', 'Tobacco'], 'avg_temp': 30, 'avg_rainfall': 800, 'water_ph_norm': 7.8, 'water_tds_norm': 550}, 'surat': {'state': 'Gujarat', 'soil': 'Black', 'crops': ['Cotton', 'Sugarcane', 'Rice'], 'avg_temp': 28, 'avg_rainfall': 1200, 'water_ph_norm': 7.5, 'water_tds_norm': 400}, # Rajasthan 'jaipur': {'state': 'Rajasthan', 'soil': 'Desert', 'crops': ['Bajra', 'Guar', 'Mustard'], 'avg_temp': 30, 'avg_rainfall': 600, 'water_ph_norm': 8.0, 'water_tds_norm': 700}, 'jodhpur': {'state': 'Rajasthan', 'soil': 'Desert', 'crops': ['Bajra', 'Moth Bean', 'Sesame'], 'avg_temp': 32, 'avg_rainfall': 350, 'water_ph_norm': 8.2, 'water_tds_norm': 800}, # Kerala 'thiruvananthapuram': {'state': 'Kerala', 'soil': 'Laterite', 'crops': ['Coconut', 'Rubber', 'Rice'], 'avg_temp': 28, 'avg_rainfall': 2500, 'water_ph_norm': 6.5, 'water_tds_norm': 100}, 'kochi': {'state': 'Kerala', 'soil': 'Alluvial', 'crops': ['Rice', 'Coconut', 'Spices'], 'avg_temp': 28, 'avg_rainfall': 3000, 'water_ph_norm': 6.5, 'water_tds_norm': 90}, # Odisha 'bhubaneswar': {'state': 'Odisha', 'soil': 'Laterite', 'crops': ['Rice', 'Pulses', 'Coconut'], 'avg_temp': 28, 'avg_rainfall': 1500, 'water_ph_norm': 7.0, 'water_tds_norm': 250}, 'cuttack': {'state': 'Odisha', 'soil': 'Alluvial', 'crops': ['Rice', 'Jute', 'Vegetables'], 'avg_temp': 28, 'avg_rainfall': 1600, 'water_ph_norm': 6.8, 'water_tds_norm': 220}, # Delhi 'new delhi': {'state': 'Delhi', 'soil': 'Alluvial', 'crops': ['Wheat', 'Vegetables', 'Mustard'], 'avg_temp': 28, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 450}, # Jammu & Kashmir 'srinagar': {'state': 'Jammu & Kashmir', 'soil': 'Mountain', 'crops': ['Apple', 'Saffron', 'Rice'], 'avg_temp': 14, 'avg_rainfall': 700, 'water_ph_norm': 7.0, 'water_tds_norm': 100}, 'jammu': {'state': 'Jammu & Kashmir', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Maize'], 'avg_temp': 24, 'avg_rainfall': 1100, 'water_ph_norm': 7.2, 'water_tds_norm': 200}, # Himachal Pradesh 'shimla': {'state': 'Himachal Pradesh', 'soil': 'Mountain', 'crops': ['Apple', 'Potato', 'Barley'], 'avg_temp': 15, 'avg_rainfall': 1500, 'water_ph_norm': 6.8, 'water_tds_norm': 80}, # Uttarakhand 'dehradun': {'state': 'Uttarakhand', 'soil': 'Alluvial', 'crops': ['Rice', 'Wheat', 'Litchi'], 'avg_temp': 22, 'avg_rainfall': 2000, 'water_ph_norm': 7.0, 'water_tds_norm': 150}, 'haridwar': {'state': 'Uttarakhand', 'soil': 'Alluvial', 'crops': ['Rice', 'Sugarcane', 'Wheat'], 'avg_temp': 24, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 200}, # Madhya Pradesh 'bhopal': {'state': 'Madhya Pradesh', 'soil': 'Black', 'crops': ['Wheat', 'Soybean', 'Gram'], 'avg_temp': 28, 'avg_rainfall': 1100, 'water_ph_norm': 7.5, 'water_tds_norm': 350}, 'indore': {'state': 'Madhya Pradesh', 'soil': 'Black', 'crops': ['Cotton', 'Soybean', 'Wheat'], 'avg_temp': 27, 'avg_rainfall': 1000, 'water_ph_norm': 7.4, 'water_tds_norm': 330}, # Chhattisgarh 'raipur': {'state': 'Chhattisgarh', 'soil': 'Red', 'crops': ['Rice', 'Pulses', 'Groundnut'], 'avg_temp': 28, 'avg_rainfall': 1300, 'water_ph_norm': 7.0, 'water_tds_norm': 280}, # Jharkhand 'ranchi': {'state': 'Jharkhand', 'soil': 'Red', 'crops': ['Rice', 'Pulses', 'Vegetables'], 'avg_temp': 26, 'avg_rainfall': 1400, 'water_ph_norm': 7.0, 'water_tds_norm': 260}, # Haryana 'chandigarh': {'state': 'Haryana', 'soil': 'Alluvial', 'crops': ['Wheat', 'Rice', 'Sugarcane'], 'avg_temp': 26, 'avg_rainfall': 900, 'water_ph_norm': 7.4, 'water_tds_norm': 380}, # Andhra Pradesh 'visakhapatnam': {'state': 'Andhra Pradesh', 'soil': 'Red Sandy', 'crops': ['Rice', 'Sugarcane', 'Coconut'], 'avg_temp': 30, 'avg_rainfall': 1200, 'water_ph_norm': 7.2, 'water_tds_norm': 350}, 'vijayawada': {'state': 'Andhra Pradesh', 'soil': 'Black', 'crops': ['Rice', 'Cotton', 'Chillies'], 'avg_temp': 32, 'avg_rainfall': 1000, 'water_ph_norm': 7.5, 'water_tds_norm': 420}, # Telangana 'hyderabad': {'state': 'Telangana', 'soil': 'Red', 'crops': ['Rice', 'Cotton', 'Maize'], 'avg_temp': 30, 'avg_rainfall': 800, 'water_ph_norm': 7.5, 'water_tds_norm': 450}, } def lookup_district(query: str) -> dict: """Find district data by name (case-insensitive, partial match).""" query = query.lower().strip() # Exact match if query in INDIAN_DISTRICTS: return INDIAN_DISTRICTS[query] # Partial match for district, data in INDIAN_DISTRICTS.items(): if query in district or district in query: return data # State match for district, data in INDIAN_DISTRICTS.items(): if data['state'].lower() in query: return data return None def get_offline_weather(district_name: str) -> dict: """Get weather norms for a district.""" data = lookup_district(district_name) if data: return { 'temperature_c': data['avg_temp'], 'rainfall_mm': data['avg_rainfall'], 'humidity': 70, 'paksha': 'waxing', 'source': 'offline_district_database', 'district': district_name.title(), 'state': data['state'] } return None def get_offline_water_baseline(district_name: str) -> dict: """Get typical water quality baselines for a district.""" data = lookup_district(district_name) if data: return { 'ph': data['water_ph_norm'], 'tds': data['water_tds_norm'], 'source': 'offline_district_database', 'district': district_name.title() } return None def list_all_districts(): """Return all district names.""" return list(INDIAN_DISTRICTS.keys()) if __name__ == '__main__': print(f'Total districts: {len(INDIAN_DISTRICTS)}') print('Cachar:', lookup_district('cachar')) print('Weather for Silchar:', get_offline_weather('cachar')) print('Water baseline for Varanasi:', get_offline_water_baseline('varanasi'))