<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;

class RolesSeeder extends Seeder
{
    public function run(): void
    {
        Role::findOrCreate('admin');
        // 角色更名：editor -> client（相容舊 DB）
        $legacyEditorRole = Role::query()->where('name', 'editor')->first();
        $clientRole = Role::query()->where('name', 'client')->first();

        if ($legacyEditorRole && (! $clientRole)) {
            $legacyEditorRole->update(['name' => 'client']);
            $clientRole = $legacyEditorRole;

            if ($this->command) {
                $this->command->info("已將角色 'editor' 更名為 'client'");
            }
        }

        Role::findOrCreate('client');

        // 預設 client 使用者（用於 client 端登入後台）
        // 優先讀 CLIENT_*，若未設定則 fallback 到舊的 EDITOR_*（相容舊專案/舊 handoff）
        $clientEmail = (string) (env('CLIENT_EMAIL') ?: env('EDITOR_EMAIL') ?: 'user@client.com');
        $clientPassword = (string) (env('CLIENT_PASSWORD') ?: env('EDITOR_PASSWORD') ?: 'password');
        $clientName = (string) (env('CLIENT_NAME') ?: env('EDITOR_NAME') ?: 'Client User');

        if (trim($clientEmail) !== '') {
            $clientUser = User::query()->where('email', $clientEmail)->first();

            $isClientNew = false;
            if (! $clientUser) {
                $clientUser = new User();
                $isClientNew = true;
            }

            $clientUser->forceFill([
                'name' => $clientName,
                'email' => $clientEmail,
                'email_verified_at' => $clientUser->email_verified_at ?? now(),
            ]);

            // 只在首次建立時設定密碼，避免每次 seed 都把既有密碼洗掉
            if ($isClientNew) {
                $clientUser->forceFill([
                    'password' => $clientPassword,
                ]);
            }

            $clientUser->save();
            $clientUser->syncRoles(['client']);

            if ($isClientNew && $this->command && trim((string) env('CLIENT_PASSWORD', '')) === '' && trim((string) env('EDITOR_PASSWORD', '')) === '') {
                $this->command->warn('CLIENT_PASSWORD 未設定：已用預設密碼建立 client 使用者（請盡快修改）。');
            }
        }

        $adminEmail = (string) env('ADMIN_EMAIL', '');
        $adminPassword = (string) env('ADMIN_PASSWORD', '');
        $adminName = (string) env('ADMIN_NAME', 'Admin');

        // 若未設定 ADMIN_EMAIL，就只建立角色不建立 admin 帳號
        if (trim($adminEmail) === '') {
            return;
        }

        $adminUser = User::query()->where('email', $adminEmail)->first();

        if (! $adminUser) {
            $adminUser = new User();
        }

        $adminUser->forceFill([
            'name' => $adminName,
            'email' => $adminEmail,
        ]);

        // 只有在提供 ADMIN_PASSWORD 時才覆蓋密碼；避免每次 seed 都把既有密碼洗掉
        if (trim($adminPassword) !== '') {
            $adminUser->forceFill([
                'password' => $adminPassword,
            ]);
        }

        // 讓登入流程更順（若專案未使用 email 驗證也不影響）
        $adminUser->forceFill([
            'email_verified_at' => $adminUser->email_verified_at ?? now(),
        ]);

        $adminUser->save();
        $adminUser->syncRoles(['admin']);

        // 若沒有設定密碼，提醒使用者（避免不小心 seed 出無法登入的 admin）
        if (trim($adminPassword) === '' && $this->command) {
            $this->command->warn('ADMIN_PASSWORD 未設定：已建立/更新 admin 使用者，但未變更密碼。');
            $this->command->warn('請在 .env 設定 ADMIN_PASSWORD，或使用既有密碼登入。');
        }
    }
}
