<?php

class CoinVariant
{
    private PDO $db;

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

    public function getAllByCoin(int $coinId): array
    {
        $stmt = $this->db->prepare(
            'SELECT cv.*, 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 coin_variants cv
             LEFT JOIN condition_options co ON cv.condition_id = co.id
             LEFT JOIN variant_type_options vt ON cv.variant_type_id = vt.id
             WHERE cv.coin_id = :coin_id
             ORDER BY cv.sort_order ASC, cv.id ASC'
        );
        $stmt->execute(['coin_id' => $coinId]);
        $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 coin_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 coin_variants (coin_id, condition_id, variant_type_id, note, owned, sort_order)
             VALUES (:coin_id, :condition_id, :variant_type_id, :note, :owned, :sort_order)'
        );
        $stmt->execute([
            'coin_id'         => $data['coin_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 deleteByCoin(int $coinId): bool
    {
        $stmt = $this->db->prepare('DELETE FROM coin_variants WHERE coin_id = :coin_id');
        return $stmt->execute(['coin_id' => $coinId]);
    }

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

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