class foodItem():
    def __init__(self, row):
        self.product_name = row['product_name']
        self.brands = row['brands']
        self.brands_tags = row['brands_tags']
        self.categories = row['categories']
        self.categories_tags = row['categories_tags']
        self.categories_en = row['categories_en']
        self.origins = row['origins']
        self.origins_tags = row['origins_tags']
        self.origins_en = row['origins_en']
        self.countries = row['countries']
        self.countries_tags = row['countries_tags']
        self.countries_en = row['countries_en']
        self.image_url = row['image_url']
        self.image_ingredients_url = row['image_ingredients_url']
        self.image_nutrition_url = row['image_nutrition_url']
        self.energy_kcal_100g = row['energy-kcal_100g']
        self.fat_100g = row['fat_100g']
        self.saturated_fat_100g = row['saturated-fat_100g']
        self.unsaturated_fat_100g = row['unsaturated-fat_100g']
        self.omega_3_fat_100g = row['omega-3-fat_100g']
        self.omega_6_fat_100g = row['omega-6-fat_100g']
        self.omega_9_fat_100g = row['omega-9-fat_100g']
        self.trans_fat_100g = row['trans-fat_100g']
        self.cholesterol_100g = row['cholesterol_100g']
        self.carbohydrates_100g = row['carbohydrates_100g']
        self.sugars_100g = row['sugars_100g']
        self.sucrose_100g = row['sucrose_100g']
        self.glucose_100g = row['glucose_100g']
        self.fructose_100g = row['fructose_100g']
        self.lactose_100g = row['lactose_100g']
        self.maltose_100g = row['maltose_100g']
        self.fiber_100g = row['fiber_100g']
        self.soluble_fiber_100g = row['soluble-fiber_100g']
        self.insoluble_fiber_100g = row['insoluble-fiber_100g']
        self.proteins_100g = row['proteins_100g']
        self.salt_100g = row['salt_100g']
        self.added_salt_100g = row['added-salt_100g']
        self.sodium_100g = row['sodium_100g']
        self.alcohol_100g = row['alcohol_100g']
        self.vitamin_a_100g = row['vitamin-a_100g']
        self.beta_carotene_100g = row['beta-carotene_100g']
        self.vitamin_d_100g = row['vitamin-d_100g']
        self.vitamin_e_100g = row['vitamin-e_100g']
        self.vitamin_k_100g = row['vitamin-k_100g']
        self.vitamin_c_100g = row['vitamin-c_100g']
        self.vitamin_b1_100g = row['vitamin-b1_100g']
        self.vitamin_b2_100g = row['vitamin-b2_100g']
        self.vitamin_pp_100g = row['vitamin-pp_100g']
        self.vitamin_b6_100g = row['vitamin-b6_100g']
        self.vitamin_b9_100g = row['vitamin-b1_100g']
        self.vitamin_b12_100g = row['vitamin-b12_100g']
        self.bicarbonate_100g = row['bicarbonate_100g']
        self.potassium_100g = row['potassium_100g']
        self.chloride_100g = row['chloride_100g']
        self.calcium_100g = row['calcium_100g']
        self.phosphorus_100g = row['phosphorus_100g']
        self.iron_100g = row['iron_100g']
        self.magnesium_100g = row['magnesium_100g']
        self.zinc_100g = row['zinc_100g']
        self.copper_100g = row['copper_100g']
        self.manganese_100g = row['manganese_100g']
        self.fluoride_100g = row['fluoride_100g']
        self.selenium_100g = row['selenium_100g']
        self.chromium_100g = row['chromium_100g']
        self.molybdenum_100g = row['molybdenum_100g']
        self.iodine_100g = row['iodine_100g']
        self.caffeine_100g = row['caffeine_100g']
        self.carbon_footprint_100g = row['carbon-footprint_100g']
        self.carbon_footprint_from_meat_or_fish_100g = row['carbon-footprint-from-meat-or-fish_100g']
        self.cocoa_100g = row['cocoa_100g']

    def is_vegan(self):
        if "meat" not in self.categories_en.lower() and "dairy" not in self.categories_en.lower():
            return True
        else:
            return False

    def nutrient_score_intl(self):
        nutrient_factors = {'fat': 9, 'saturated_fat': 10, 'trans_fat': 10, 'cholesterol': 5, 
                            'sodium': 6, 'carbohydrates': 7, 'sugars': 6, 'fiber': 5, 
                            'proteins': 5, 'vitamin_a': 15, 'vitamin_c': 15, 'calcium': 10, 
                            'iron': 10}
        
        nutrient_scores = {}
        for nutrient, factor in nutrient_factors.items():
            value = getattr(self, nutrient+'_100g')
            if value is not None:
                nutrient_scores[nutrient] = min(100, max(0, factor * (value / self._get_daily_requirement(nutrient))))
        
        # sum the nutrient scores to arrive at the total nutrient score
        total_score = sum(nutrient_scores.values())
        
        return total_score
    
    def _get_daily_requirement(self, nutrient):
        daily_requirement = {'fat': 70, 'saturated_fat': 20, 'trans_fat': 2, 'cholesterol': 300, 
                             'sodium': 2000, 'carbohydrates': 260, 'sugars': 90, 'fiber': 38, 
                             'proteins': 50, 'vitamin_a': 900, 'vitamin_c': 90, 'calcium': 1000, 
                             'iron': 18}
        
        # for nutrients without a daily requirement, return None
        return daily_requirement.get(nutrient, None)

    @classmethod
    def load_from_dataframe(cls, df):
        products = []
        for i, row in df.iterrows():
            product = cls(row)
            products.append(product)
        return products
    
    def __str__(self) -> str:
        return self.product_name