<?php

class VariantTypeOption
{
    private PDO $db;
    private array $languages = ['en', 'sr', 'de', 'es', 'fr', 'it', 'pt', 'nl', 'pl', 'ru', 'tr', 'cs', 'el', 'hu', 'ro', 'sv', 'no', 'jp', 'cn', 'il'];

    public function __construct()
    {
        $this->db = Database::getInstance();
    }

    public function getAll(): array
    {
        $stmt = $this->db->query('SELECT * FROM variant_type_options ORDER BY sort_order ASC, id ASC');
        $options = $stmt->fetchAll();
        
        // Add localized label to each option
        foreach ($options as &$opt) {
            $opt['localized_label'] = $this->getLocalizedLabel($opt);
        }
        
        return $options;
    }

    public function findById(int $id): ?array
    {
        $stmt = $this->db->prepare('SELECT * FROM variant_type_options WHERE id = :id LIMIT 1');
        $stmt->execute(['id' => $id]);
        $row = $stmt->fetch();
        
        if ($row) {
            $row['localized_label'] = $this->getLocalizedLabel($row);
        }
        
        return $row ?: null;
    }

    public function create(array $data): int
    {
        $fields = ['label', 'sort_order'];
        $values = [$data['label'], $data['sort_order'] ?? 0];
        
        // Add language fields if provided
        foreach ($this->languages as $lang) {
            $field = 'label_' . $lang;
            if (isset($data[$field])) {
                $fields[] = $field;
                $values[] = $data[$field];
            }
        }
        
        $placeholders = implode(',', array_fill(0, count($fields), '?'));
        $fieldNames = implode(',', $fields);
        
        $stmt = $this->db->prepare(
            "INSERT INTO variant_type_options ($fieldNames) VALUES ($placeholders)"
        );
        $stmt->execute($values);
        return (int)$this->db->lastInsertId();
    }

    public function update(int $id, array $data): bool
    {
        $setParts = [];
        $values = [];
        
        // Always update label as fallback
        $setParts[] = 'label = ?';
        $values[] = $data['label'] ?? '';
        
        // Update language fields if provided
        foreach ($this->languages as $lang) {
            $field = 'label_' . $lang;
            if (isset($data[$field])) {
                $setParts[] = "$field = ?";
                $values[] = $data[$field];
            }
        }
        
        // Update sort_order if provided
        if (isset($data['sort_order'])) {
            $setParts[] = 'sort_order = ?';
            $values[] = $data['sort_order'];
        }
        
        $values[] = $id;
        
        $stmt = $this->db->prepare(
            'UPDATE variant_type_options SET ' . implode(',', $setParts) . ' WHERE id = ?'
        );
        return $stmt->execute($values);
    }

    public function delete(int $id): bool
    {
        $stmt = $this->db->prepare('DELETE FROM variant_type_options WHERE id = :id');
        return $stmt->execute(['id' => $id]);
    }
    
    private function getLocalizedLabel(array $option): string
    {
        $currentLang = Lang::getLocale();
        $field = 'label_' . $currentLang;
        
        // Return translated label if exists
        if (!empty($option[$field])) {
            return $option[$field];
        }
        
        // Fallback to English
        if (!empty($option['label_en'])) {
            return $option['label_en'];
        }
        
        // Fallback to original label
        return $option['label'] ?? '';
    }
}
