<?php

namespace App\Filament\Pages;

use App\Models\Setting;
use App\Support\ScriptUpdater;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Form;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Livewire\WithFileUploads;

class ManageSettings extends Page implements HasForms
{
    use InteractsWithForms;
    use WithFileUploads;

    protected static ?string $navigationIcon = 'heroicon-o-cog-6-tooth';
    protected static ?string $navigationGroup = 'مدیریت سیستم';
    protected static ?string $navigationLabel = 'تنظیمات عمومی';
    protected static ?string $title = 'تنظیمات عمومی';
    protected static ?int $navigationSort = 9;

    protected static string $view = 'filament.pages.manage-settings';

    public ?array $data = [];

    /** فایل ZIP به‌روزرسانی اسکریپت */
    public $updateFile = null;

    /** نتیجه‌ی تست اتصال پیامک */
    public ?array $smsStatus = null;

    public static function canAccess(): bool
    {
        return auth()->user()?->can('access_settings') ?? false;
    }

    public static function shouldRegisterNavigation(): bool
    {
        return static::canAccess();
    }

    public function mount(): void
    {
        abort_unless(static::canAccess(), 403);
        $this->form->fill(Setting::current()->attributesToArray());
    }

    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Section::make('اطلاعات شرکت')->columns(2)->schema([
                    TextInput::make('company_name')->label('نام شرکت')
                        ->helperText('در صورت نبود لوگو، همین نام بالای منو نمایش داده می‌شود.'),
                    TextInput::make('tagline')->label('شعار شرکت')
                        ->helperText('زیر لوگو (یا عنوان) در منوی کناری نمایش داده می‌شود.'),
                    FileUpload::make('logo_path')->label('لوگوی شرکت (بالای منو)')
                        ->image()->directory('logos')->webp()
                        ->helperText('اگر خالی بماند، نام شرکت نمایش داده می‌شود.'),
                    FileUpload::make('favicon_path')->label('فاویکون (آیکن تب مرورگر)')
                        ->image()->directory('logos')
                        ->helperText('فرمت PNG یا ICO؛ اندازه‌ی پیشنهادی ۳۲×۳۲ یا ۶۴×۶۴ پیکسل.'),
                    TextInput::make('phone')->label('تلفن'),
                    TextInput::make('email')->label('ایمیل')->email(),
                    TextInput::make('economic_code')->label('کد اقتصادی'),
                    TextInput::make('national_id')->label('شناسه ملی'),
                    Textarea::make('address')->label('آدرس')->columnSpanFull(),
                ]),
                Section::make('تنظیمات CRM')->columns(2)->schema([
                    TextInput::make('follow_up_days')->label('هشدار سرنخ بدون پیگیری (روز)')->numeric()->default(7),
                    TextInput::make('stale_days')->label('مشتری راکد بعد از (روز)')->numeric()->default(30),
                ]),
                Section::make('پیامک (کاوه‌نگار)')
                    ->description('برای ارسال پیامک اطلاع‌رسانی به مشتریان، کلید API پنل کاوه‌نگار را وارد کنید.')
                    ->columns(2)
                    ->schema([
                        TextInput::make('sms_api_key')->label('کلید API کاوه‌نگار')
                            ->password()->revealable()->columnSpanFull(),
                        TextInput::make('sms_sender')->label('شماره خط فرستنده (اختیاری)')
                            ->placeholder('مثلاً 100090004000'),
                    ]),
            ])
            ->statePath('data');
    }

    /** تست اتصال به کاوه‌نگار با کلید واردشده در فرم. */
    public function testSmsConnection(): void
    {
        $apiKey = $this->data['sms_api_key'] ?? null;
        $result = \App\Support\Sms::testConnection($apiKey);
        $this->smsStatus = $result;

        if ($result['ok']) {
            Notification::make()->success()->title($result['message'])->send();
        } else {
            Notification::make()->danger()->title($result['message'])->send();
        }
    }

    public function save(): void
    {
        Setting::current()->update($this->form->getState());

        Notification::make()->success()->title('تنظیمات ذخیره شد')->send();
    }

    public function canUpdateScript(): bool
    {
        return auth()->user()?->can('access_updates') ?? false;
    }

    /** اعمال فایل به‌روزرسانی آپلودشده. */
    public function applyUpdate(): void
    {
        abort_unless($this->canUpdateScript(), 403);

        $this->validate([
            'updateFile' => ['required', 'file', 'mimes:zip'],
        ], [], ['updateFile' => 'فایل به‌روزرسانی']);

        $result = ScriptUpdater::apply($this->updateFile->getRealPath());

        $this->updateFile = null;

        if ($result['ok']) {
            Notification::make()->success()->title('به‌روزرسانی انجام شد')->body($result['message'])->persistent()->send();
        } else {
            Notification::make()->danger()->title('خطا در به‌روزرسانی')->body($result['message'])->persistent()->send();
        }
    }
}
