<?php

namespace App\Console\Commands;

use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class ImportWordpressUsers extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'import:wordpress-users';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Import users from WordPress system';

    /**
     * Execute the console command.
     */
    public function handle()
    {
        // Lấy users từ database WordPress
        $wpUsers = DB::connection('wordpress')
            ->table('wp_users')
            ->leftJoin('wp_usermeta', function ($join) {
                $join->on('wp_users.ID', '=', 'wp_usermeta.user_id')
                    ->where('wp_usermeta.meta_key', '=', 'wp_capabilities');
            })
            ->select('wp_users.*', 'wp_usermeta.meta_value as roles')
            ->get();

        // Save users information to CSV file
        $csvHeader = "Email, Password, Role\n";
        $csvData = '';

        // Tạo user trong database
        foreach ($wpUsers as $key => $user) {
            $roles = unserialize($user->roles) ?: [];
            $roleName = 'subscriber';
            if (isset($roles)) {
                foreach ($roles as $keyRole => $role) {
                    $roleName = $keyRole;
                    break;
                }
            }

            $rawPassword = $this->generateRandomPassword(16);
            $csvData .= $user->user_email . ',' . $rawPassword . ', ' . ucfirst($roleName) . "\n";

            $newUser = User::where('id', $user->ID)->first();
            if ($newUser) {
                $newUser->update([
                    'name'              => $user->user_login,
                    'email'             => $user->user_email,
                    'password'          => bcrypt($rawPassword),
                    'email_verified_at' => now(),
                    'created_at'        => $user->user_registered,
                    'updated_at'        => $user->user_registered,
                ]);
            } else {
                $newUser = User::create([
                    'id'                => $user->ID,
                    'name'              => $user->user_login,
                    'email'             => $user->user_email,
                    'password'          => bcrypt($rawPassword),
                    'email_verified_at' => now(),
                    'created_at'        => $user->user_registered,
                    'updated_at'        => $user->user_registered,
                ]);
            }

            $newUser->syncRoles([]);
            $newUser->assignRole($roleName);

            $this->info("Importing user {$key}: " . $user->ID . ' - ' . $user->user_login . ' -> [' . $newUser->id . '] - Name: ' . $newUser->name . ' - Email: ' . $newUser->email . ' - Role: ' . $roleName);
        }

        // Ghi file CSV
        $filePath = storage_path('app/public/users.csv');
        file_put_contents($filePath, $csvHeader . $csvData);

        $this->info('Users imported successfully!');
    }

    private function generateRandomPassword($length = 10)
    {
        $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';

        // Generate secure random bytes
        $bytes = random_bytes($length);

        // Map random bytes to characters
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[ord($bytes[$i]) % $charactersLength];
        }

        return $randomString;
    }
}
