<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Cache;

class Setting extends Model
{
    protected $primaryKey = 'key';
    public    $incrementing = false;
    protected $keyType      = 'string';

    protected $fillable = ['key', 'value', 'label', 'group', 'type'];

    // ── Defaults — dipakai saat key belum ada di DB ───────────
    public static array $defaults = [
        // Identitas perusahaan
        'company_name'    => 'Service Center',
        'company_tagline' => 'Layanan Perbaikan Komputer & Laptop Profesional',
        'company_address' => 'Jl. Contoh No. 1, Kota Anda',
        'company_phone'   => '0800-000-0000',
        'company_email'   => 'service@example.com',
        'company_website' => '',

        // Nota / Tanda Terima
        'nota_header_note'  => '',   // catatan tambahan di kop nota
        'nota_footer_note'  => 'Simpan dokumen ini sebagai bukti penyerahan/pengambilan perangkat.',
        'nota_show_logo'    => '1',  // tampilkan blok logo
        'nota_show_cost'    => '1',  // tampilkan kotak estimasi biaya
        'nota_show_ttd'     => '1',  // tampilkan kotak tanda tangan

        // Form pendaftaran tiket (teks bantu)
        'form_ticket_note'  => '',   // teks info di atas form tiket baru
        'form_ticket_terms' => "SYARAT & KETENTUAN LAYANAN SERVIS\n\n1. Pelanggan wajib memberikan informasi yang benar dan lengkap mengenai keluhan atau kerusakan perangkat yang diserahkan.\n\n2. Estimasi biaya perbaikan bersifat perkiraan dan dapat berubah berdasarkan hasil pemeriksaan lebih lanjut. Pelanggan akan dikonfirmasi terlebih dahulu sebelum perbaikan dilanjutkan apabila terdapat biaya tambahan.\n\n3. Service Center tidak bertanggung jawab atas kehilangan data selama proses perbaikan. Sangat disarankan untuk melakukan backup data sebelum menyerahkan perangkat.\n\n4. Garansi perbaikan berlaku 7 (tujuh) hari sejak perangkat diambil, khusus untuk kerusakan yang sama dan bukan disebabkan oleh penggunaan yang tidak semestinya atau kerusakan baru.\n\n5. Perangkat yang tidak diambil dalam 30 (tiga puluh) hari sejak pemberitahuan selesai dapat dikenakan biaya penyimpanan.\n\n6. Dengan menyerahkan perangkat, pelanggan dianggap telah membaca, memahami, dan menyetujui seluruh syarat dan ketentuan di atas.",   // syarat & ketentuan

        // Invoice
        'invoice_primary_color' => '#1d4ed8',
        'invoice_logo_path'     => '',
        'invoice_footer_text'   => 'Terima kasih atas kepercayaan Anda.',
        'invoice_payment_terms' => 'Pembayaran dilakukan paling lambat pada tanggal jatuh tempo yang tertera.',
        'invoice_show_qr'       => '1',
        'invoice_show_signature'=> '1',
        'invoice_show_due_date' => '1',
        'invoice_show_source'   => '1',
        'invoice_show_public_note' => '1',

        // Kontak WA default untuk pemberitahuan
        'wa_admin_number'   => '',
    ];

    // ── Ambil nilai setting (dengan cache 60 menit) ───────────
    public static function get(string $key, ?string $fallback = null): string
    {
        $cached = Cache::remember("setting.{$key}", 3600, function () use ($key) {
            $row = static::find($key);
            return $row ? (string) $row->value : '__NULL__';
        });

        if ($cached === '__NULL__') {
            return $fallback ?? (static::$defaults[$key] ?? '');
        }

        return $cached;
    }

    // ── Simpan nilai setting (dan hapus cache) ────────────────
    public static function set(string $key, ?string $value): void
    {
        static::updateOrCreate(['key' => $key], ['value' => $value]);
        Cache::forget("setting.{$key}");
    }

    // ── Simpan banyak sekaligus ────────────────────────────────
    public static function setMany(array $data): void
    {
        foreach ($data as $key => $value) {
            static::set($key, $value);
        }
    }
}
