<?php

class ItemVariant
{
    private PDO $db;

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

    public function getAllByItem(int $itemId): array
    {
        $stmt = $this->db->prepare(
            'SELECT iv.*, co.label AS condition_label, co.description AS condition_desc,
                    vt.label, vt.label_en, vt.label_sr, vt.label_de, vt.label_es, vt.label_fr,
                    vt.label_it, vt.label_pt, vt.label_nl, vt.label_pl, vt.label_ru, vt.label_tr,
                    vt.label_cs, vt.label_el, vt.label_hu, vt.label_ro, vt.label_sv, vt.label_no,
                    vt.label_jp, vt.label_cn, vt.label_il
             FROM item_variants iv
             LEFT JOIN condition_options co ON iv.condition_id = co.id
             LEFT JOIN variant_type_options vt ON iv.variant_type_id = vt.id
             WHERE iv.item_id = :item_id
             ORDER BY iv.sort_order ASC, iv.id ASC'
        );
        $stmt->execute(['item_id' => $itemId]);
        $variants = $stmt->fetchAll();
        
        // Add localized label to each variant
        foreach ($variants as &$variant) {
            $variant['variant_type_label'] = $this->getLocalizedVariantLabel($variant);
        }
        
        return $variants;
    }
    
    private function getLocalizedVariantLabel(array $variant): string
    {
        $currentLang = Lang::getLocale();
        $field = 'label_' . $currentLang;
        
        // Return translated label if exists
        if (!empty($variant[$field])) {
            return $variant[$field];
        }
        
        // Fallback to English
        if (!empty($variant['label_en'])) {
            return $variant['label_en'];
        }
        
        // Fallback to original label
        return $variant['label'] ?? '';
    }

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

    public function create(array $data): int
    {
        $stmt = $this->db->prepare(
            'INSERT INTO item_variants (item_id, condition_id, variant_type_id, note, owned, sort_order)
             VALUES (:item_id, :condition_id, :variant_type_id, :note, :owned, :sort_order)'
        );
        $stmt->execute([
            'item_id'         => $data['item_id'],
            'condition_id'    => $data['condition_id'] ?: null,
            'variant_type_id' => $data['variant_type_id'] ?: null,
            'note'            => $data['note'] ?? null,
            'owned'           => $data['owned'] ?? 0,
            'sort_order'      => $data['sort_order'] ?? 0,
        ]);
        return (int)$this->db->lastInsertId();
    }

    public function deleteByItem(int $itemId): bool
    {
        $stmt = $this->db->prepare('DELETE FROM item_variants WHERE item_id = :item_id');
        return $stmt->execute(['item_id' => $itemId]);
    }

    public function toggleOwned(int $id): bool
    {
        $stmt = $this->db->prepare('UPDATE item_variants SET owned = NOT owned WHERE id = :id');
        return $stmt->execute(['id' => $id]);
    }

    public function hasOwnedVariant(int $itemId): bool
    {
        $stmt = $this->db->prepare('SELECT COUNT(*) FROM item_variants WHERE item_id = :item_id AND owned = 1');
        $stmt->execute(['item_id' => $itemId]);
        return (int)$stmt->fetchColumn() > 0;
    }
}
