#!/usr/bin/env python3
"""คดี C2 - แบบจำลองการยืดระยะเวลาเสบียงฉุกเฉิน
แก้สมมติฐานเพื่อเปรียบเทียบแนวทาง ตัวเลขบัญชีภารกิจเป็นข้อมูลสมมติของคดี ส่วนตรรกะคำนวณยึดหลักการอนุรักษ์มวลและพลังงาน
"""
import csv
import math
from pathlib import Path
HERE=Path(__file__).resolve().parent

CREW=5
TARGET_KCAL_PER_PERSON_DAY=1850
TARGET_PROTEIN_G_PER_PERSON_DAY=65
EXPECTED_DAYS_TO_NODE=61
ALGAE_KCAL_PER_KG=3900
ALGAE_PROTEIN_G_PER_KG=600
ASSUMED_AVG_ALGAE_KG_DAY=0.20

# บัญชีคดีระบุแพ็กวิตามิน/แร่ธาตุ 2.2 กก. แต่ไม่มีฉลาก จำนวนหน่วย หรือผลวิเคราะห์
# ค่าด้านล่างเป็นสมมติฐานเพื่อสาธิตที่แก้ไขได้ ไม่ใช่ผลตรวจจากคดี
# ควรแทนค่าด้วยข้อมูลฉลากจริงก่อนใช้อ้างอิงการครอบคลุมสารอาหารรอง

def load_stock():
    rows=[]
    with open(HERE/'13_FOOD_STOCK_C2.csv',encoding='utf-8-sig') as f:
        for r in csv.DictReader(f): rows.append(r)
    return rows

def load_micronutrient_profile():
    with open(HERE/'18_MICRONUTRIENT_ASSUMPTIONS_C2.csv',encoding='utf-8-sig') as f:
        return list(csv.DictReader(f))

rows=load_stock()
micronutrient_profile=load_micronutrient_profile()
VITAMIN_MINERAL_SACHET_MASS_G=float(micronutrient_profile[0]['assumed_sachet_mass_g'])
stock_kcal=sum(float(r['dry_mass_kg'])*float(r['kcal_per_kg_dry']) for r in rows)
stock_protein=sum(float(r['dry_mass_kg'])*float(r['protein_g_per_kg']) for r in rows)
water_needed=sum(float(r['dry_mass_kg'])*float(r['rehydration_water_L_per_kg']) for r in rows)
vitamin_pack=next(r for r in rows if r['item']=='vitamin-mineral packs')
vitamin_pack_mass_g=float(vitamin_pack['dry_mass_kg'])*1000
estimated_sachets=math.floor(vitamin_pack_mass_g/VITAMIN_MINERAL_SACHET_MASS_G)
micronutrient_days=estimated_sachets/CREW
algae_kcal=ASSUMED_AVG_ALGAE_KG_DAY*ALGAE_KCAL_PER_KG
algae_protein=ASSUMED_AVG_ALGAE_KG_DAY*ALGAE_PROTEIN_G_PER_KG
daily_kcal_need=CREW*TARGET_KCAL_PER_PERSON_DAY
daily_protein_need=CREW*TARGET_PROTEIN_G_PER_PERSON_DAY
days_by_energy=stock_kcal/(daily_kcal_need-algae_kcal)
days_by_protein=stock_protein/(daily_protein_need-algae_protein)
print(f'พลังงานจากเสบียง: {stock_kcal:,.0f} กิโลแคลอรี')
print(f'โปรตีนจากเสบียง: {stock_protein/1000:,.1f} กก.')
print(f'น้ำที่ใช้คืนรูปเสบียงทั้งหมด: {water_needed:,.1f} ลิตร')
print(f'มวลแพ็กวิตามิน/แร่ธาตุ: {vitamin_pack_mass_g:,.0f} กรัม')
print(f'สมมติซองละ {VITAMIN_MINERAL_SACHET_MASS_G:g} กรัม; คาดว่ามี {estimated_sachets:,.0f} หน่วยเต็ม')
print(f'จำนวนหน่วยโดยประมาณครอบคลุม {micronutrient_days:.1f} วัน สำหรับลูกเรือ {CREW} คน (สมมติคนละหนึ่งหน่วยต่อวัน)')
print('ประมาณการสารอาหารรอง (ปริมาณสมมติต่อหน่วยเทียบกับเป้าหมายรายวันสมมติ):')
for row in micronutrient_profile:
    nutrient=row['nutrient']
    unit=row['unit']
    amount_per_sachet=float(row['assumed_per_sachet'])
    target_per_person_day=float(row['daily_target_per_person'])
    total=estimated_sachets*amount_per_sachet
    target=CREW*EXPECTED_DAYS_TO_NODE*target_per_person_day
    coverage_pct=100*total/target if target else 0
    days=estimated_sachets*amount_per_sachet/(CREW*target_per_person_day) if target_per_person_day else 0
    print(f'  {nutrient:12s} รวม {total:,.1f} {unit}; ครอบคลุม {coverage_pct:5.1f}% ของเป้าหมาย {EXPECTED_DAYS_TO_NODE} วัน; เทียบเท่า {days:.1f} วัน-คน')
print(f'สมมติสาหร่ายให้พลังงาน {algae_kcal:,.0f} กิโลแคลอรี/วัน และโปรตีน {algae_protein:.0f} กรัม/วัน')
print(f'จำนวนวันที่พลังงานรองรับได้: {days_by_energy:.1f} วัน')
print(f'จำนวนวันที่โปรตีนรองรับได้: {days_by_protein:.1f} วัน')
print(f'เป้าหมายระยะทางถึง Node Zero: {EXPECTED_DAYS_TO_NODE} วัน')
print('หมายเหตุ: ค่าสารอาหารรองข้างต้นเป็นสมมติฐานเพื่อสาธิต เนื่องจากไม่มีฉลากซอง แบบจำลองไม่รวมสารอาหารจากอาหาร การดูดซึม ความต้องการเฉพาะบุคคล ความเสี่ยงทางการแพทย์ ความล้มเหลวของการเพาะเลี้ยง และปริมาณสำรอง')
