<?php
/*
    * Created by VahabDev in Aparat Live
    * Website: https://pourfi.ir
    * Aparat Live: https://www.aparat.com/vahabdev/live
    * Aparat Channel: https://www.aparat.com/vahabdev
    * Rubika Channel: https://rubika.ir/vahabdev
    * Donate: https://reymit.ir/vahabdev
    * Telegram: https://t.me/vahabdev
*/


namespace App\Http\Controllers;

use App\Models\Setting;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;


class InstallerController extends Controller
{
    // نمایش صفحه اول (دیتابیس)
    public function index()
    {
        if (file_exists(storage_path('installed'))) {
            return redirect('/');
        }
        return view('installer.step1');
    }

    // پردازش اطلاعات دیتابیس و نمایش مرحله دوم
    public function processStep1(Request $request)
    {
        $request->validate([
            'db_host' => 'required',
            'db_port' => 'required',
            'db_database' => 'required',
            'db_username' => 'required',
        ]);

        // تنظیم موقت کانکشن دیتابیس برای تست
        config(['database.connections.mysql.host' => $request->db_host]);
        config(['database.connections.mysql.port' => $request->db_port]);
        config(['database.connections.mysql.database' => $request->db_database]);
        config(['database.connections.mysql.username' => $request->db_username]);
        config(['database.connections.mysql.password' => $request->db_password]);

        try {
            DB::connection()->getPdo();
            session()->put('db_config', $request->only(['db_host', 'db_port', 'db_database', 'db_username', 'db_password']));
            return redirect()->route('installer.step2');
        } catch (\Exception $e) {
            return back()->withInput()->with('error', 'ارتباط با دیتابیس برقرار نشد: ' . $e->getMessage());
        }
    }

    // نمایش صفحه دوم (تنظیمات سایت و دیسک‌ها)
    public function step2(Request $request)
    {
        $CurrentDisk = $request->server('DOCUMENT_ROOT');
        $parentPath = dirname($CurrentDisk);
        $DiskFiles = $parentPath . DIRECTORY_SEPARATOR . 'FileDisk';


        $siteUrl = $request->server('HTTP_HOST');

        if (!session()->has('db_config')) {
            return redirect()->route('installer.index');
        }

        return view('installer.step2', compact(
            'CurrentDisk',
            'DiskFiles',
            'siteUrl'
        ));
    }

    public function processStep2(Request $request)
    {
        $request->validate([
            'site_name' => 'required',
            'site_url' => 'required|url',
            'disk_upload_path' => 'required',
            'disk_files_path' => 'required',
            'admin_folder' => 'required',
        ]);


        // ذخیره موقت تنظیمات سایت در سشن
        session()->put('site_config', $request->only(['site_name', 'site_url', 'site_description', 'disk_upload_path', 'disk_files_path', 'admin_folder']));

        return redirect()->route('installer.step3');
    }

    public function step3()
    {
        if (!session()->has('site_config')) {
            return redirect()->route('installer.step2');
        }
        return view('installer.step3');
    }

    // پردازش نهایی و نصب
    public function finish(Request $request)
    {
        $request->validate([
            'admin_name' => 'required',
            'admin_email' => 'required|email',
            'password' => 'required|min:6|confirmed',
        ]);

        $admin_name = $request->admin_name;
        $admin_email = $request->admin_email;
        $adminPassword = $request->password;

        // دریافت اطلاعات از سشن با روش امن‌تر
        $siteConfig = session('site_config');
        $dbConfig = session('db_config');

        $site_name = $siteConfig['site_name'];
        $site_url = $siteConfig['site_url'];
        $site_description = $siteConfig['site_description'];
        $disk_upload_path = $siteConfig['disk_upload_path'];
        $disk_files_path = $siteConfig['disk_files_path'];
        $admin_folder = $siteConfig['admin_folder'];



        $CurrentDisk = $request->server('DOCUMENT_ROOT');
        $parentPath = dirname($CurrentDisk);
        $DiskFilesMake = $parentPath . DIRECTORY_SEPARATOR . $disk_files_path;
        $DiskUploadFilesMake = $CurrentDisk . DIRECTORY_SEPARATOR . 'content' . DIRECTORY_SEPARATOR . $disk_upload_path;



        // ساخت پوشه‌ها
        if (!is_dir($DiskFilesMake)) {
            if (!mkdir($DiskFilesMake, 0755, true)) {
                return back()->with('error', "خطا: امکان ساخت پوشه در مسیر {$DiskFilesMake} وجود ندارد.");
            }
        }
        if (!is_dir($DiskUploadFilesMake)) {
            if (!mkdir($DiskUploadFilesMake, 0755, true)) {
                return back()->with('error', "خطا: امکان ساخت پوشه در مسیر {$DiskUploadFilesMake} وجود ندارد.");
            }
        }

        try {
            // ۱. نوشتن اطلاعات دیتابیس در .env
            $this->writeEnv([
                'DB_CONNECTION' => 'mysql',
                'DB_HOST' => $dbConfig['db_host'],
                'DB_PORT' => $dbConfig['db_port'],
                'DB_DATABASE' => $dbConfig['db_database'],
                'DB_USERNAME' => $dbConfig['db_username'],
                'DB_PASSWORD' => $dbConfig['db_password'],
                'APP_URL' => $site_url,
                'ROOTDIR' => $CurrentDisk,
                'DiskUpload' => $disk_upload_path,
                'DiskFiles' => $disk_files_path
            ]);

            // ۲. پاک کردن کانفیگ برای بارگذاری تنظیمات جدید
            Artisan::call('config:clear');

            // --- بخش مهم: تنظیم دستی کانکشن برای استفاده در همین درخواست ---
            config([
                'database.connections.mysql.host' => $dbConfig['db_host'],
                'database.connections.mysql.port' => $dbConfig['db_port'],
                'database.connections.mysql.database' => $dbConfig['db_database'],
                'database.connections.mysql.username' => $dbConfig['db_username'],
                'database.connections.mysql.password' => $dbConfig['db_password'],
            ]);
            // ---------------------------------------------------------------------

            // ۳. اجرای مایگریشن‌ها (حالا از تنظیمات بالا استفاده می‌کند)
            Artisan::call('migrate', ['--force' => true]);

            // ثبت تنظیمات
            Setting::create(['name' => 'site_name', 'value' => $site_name]);
            Setting::create(['name' => 'site_url', 'value' => $site_url]);
            Setting::create(['name' => 'site_description', 'value' => $site_description]);
            Setting::create(['name' => 'ZarinpalToken']);
            Setting::create(['name' => 'site_tags']);
            Setting::create(['name' => 'admin_url', 'value' => $admin_folder]);

            // ایجاد کاربر ادمین
            User::create([
                'name' => $admin_name,
                'email' => $admin_email,
                'email_verified_at' => Carbon::now(),
                'password' => bcrypt($adminPassword)
            ]);

            // ۵. ساخت فایل قفل نصب
            file_put_contents(storage_path('installed'), date('Y-m-d H:i:s'));

            // تغییر درایور سشن به دیتابیس (در پایان کار)
            $this->writeEnv(['SESSION_DRIVER' => 'database']);

            return redirect()->route('installer.success');

        } catch (\Exception $e) {
            return back()->withInput()->with('error', 'خطا در مراحل نهایی نصب: ' . $e->getMessage());
        }
    }




    private function writeEnv($data)
    {
        $envFile = base_path('.env');
        if (!file_exists($envFile)) {
            copy(base_path('.env.example'), $envFile);
        }

        $envContent = file_get_contents($envFile);

        foreach ($data as $key => $value) {
            if (strpos($envContent, "{$key}=") !== false) {
                $envContent = preg_replace("/^{$key}=.*/m", "{$key}={$value}", $envContent);
            } else {
                $envContent .= "\n{$key}={$value}";
            }
        }

        file_put_contents($envFile, $envContent);
    }

    public function success()
    {
        return view('installer.success');
    }
}
