<?php

declare(strict_types=1);

namespace Database\Seeders;

use App\Models\Board;
use App\Models\BoardCategory;
use App\Models\Post;
use App\Models\PostComment;
use App\Models\Tenant;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;

class DefaultBoardsSeeder extends Seeder
{
    public function run(): void
    {
        // ---------- 기본 테넌트 보장 (도메인 동적화) ----------
        $appUrl  = (string) config('app.url', '');
        $host    = $appUrl !== '' ? parse_url($appUrl, PHP_URL_HOST) : null;
        $domain  = $host ?: env('APP_HOST', 'localhost');

        $tenant = Tenant::withoutGlobalScopes()
            ->firstOrCreate(
                ['domain' => $domain],
                [
                    'id' => (string) Str::uuid(),
                    'name' => (string) config('app.name', 'EasyBox Demo'),
                    'status' => Tenant::STATUS_ACTIVE,
                    'plan' => Tenant::PLAN_FREE,
                ]
            );

        // 활성화 보장
        if ($tenant->status !== Tenant::STATUS_ACTIVE) {
            $tenant->update(['status' => Tenant::STATUS_ACTIVE]);
        }

        app()->instance('currentTenant', $tenant);

        // ---------- 5 게시판 ----------
        $defs = [
            [
                'slug' => 'notice', 'name' => '공지사항', 'group_name' => '운영',
                'description' => '운영진이 게시하는 공지사항입니다.',
                'skin' => 'list',
                'perms_read' => 'guest', 'perms_write' => 'admin',
                'perms_comment' => 'member', 'perms_download' => 'guest',
                'sort_order' => 1,
                'categories' => [],
            ],
            [
                'slug' => 'free', 'name' => '자유게시판', 'group_name' => '커뮤니티',
                'description' => '자유롭게 이야기를 나누는 공간입니다.',
                'skin' => 'list',
                'perms_read' => 'guest', 'perms_write' => 'member',
                'perms_comment' => 'member', 'perms_download' => 'member',
                'sort_order' => 10,
                'categories' => ['일상', '잡담', '유머', '질문'],
            ],
            [
                'slug' => 'qa', 'name' => '질문답변', 'group_name' => '커뮤니티',
                'description' => '궁금한 점을 묻고 답하는 게시판입니다.',
                'skin' => 'qa',
                'perms_read' => 'guest', 'perms_write' => 'member',
                'perms_comment' => 'member', 'perms_download' => 'member',
                'sort_order' => 11,
                'categories' => ['일반', '기술', '제품', '기타'],
            ],
            [
                'slug' => 'data', 'name' => '자료실', 'group_name' => '자료',
                'description' => '회원 전용 자료실입니다.',
                'skin' => 'list',
                'perms_read' => 'member', 'perms_write' => 'member',
                'perms_comment' => 'member', 'perms_download' => 'member',
                'sort_order' => 20,
                'categories' => ['문서', '이미지', '코드'],
            ],
            [
                'slug' => 'gallery', 'name' => '갤러리', 'group_name' => '자료',
                'description' => '사진과 이미지를 공유하는 갤러리입니다.',
                'skin' => 'gallery',
                'perms_read' => 'guest', 'perms_write' => 'member',
                'perms_comment' => 'member', 'perms_download' => 'guest',
                'sort_order' => 21,
                'categories' => ['풍경', '인물', '제품', '기타'],
            ],
        ];

        $sampleTitles = [
            'notice' => [
                ['W·Dot 커뮤니티 오픈 안내', '안녕하세요. W·Dot 커뮤니티가 정식 오픈했습니다. 많은 참여 부탁드립니다.'],
                ['이용 약관 개정 안내 (v1.2)', '2026년 5월 21일부로 이용 약관이 일부 개정되었습니다. 자세한 내용은 본문을 참고해주세요.'],
                ['시스템 정기 점검 일정', '매주 화요일 02:00~04:00 정기 점검이 예정되어 있습니다.'],
            ],
            'free' => [
                ['커뮤니티 첫 글이에요 🙂', '안녕하세요! W·Dot CMS 로 만든 커뮤니티 정말 멋지네요.'],
                ['그누보드 스타일 게시판이라 익숙해요', '예전부터 그누보드를 써왔는데 이런 UX 가 익숙하고 좋습니다.'],
                ['오늘 점심 뭐 드셨나요?', '저는 김치찌개 먹었어요. 다들 맛점 하세요!'],
                ['Pretendard 폰트 너무 예쁘네요', 'W·Dot 디자인 토큰이 정말 잘 짜여있어서 보기 좋습니다.'],
                ['5 테마 전환 데모 보고 싶어요', 'Aqua, Mint, Olive, Coral, Slate 다 보고 싶습니다.'],
            ],
            'qa' => [
                ['게시판 권한은 어떻게 설정하나요?', '회원만 글쓰기 가능하게 하려면 어떻게 해야 하나요?'],
                ['첨부 파일 용량 제한은?', '최대 첨부 파일 크기가 궁금합니다.'],
                ['커스텀 도메인 연결 가이드 있나요?', '서브도메인 연결 방법 안내 부탁드립니다.'],
            ],
            'data' => [
                ['W·Dot 사용 가이드 PDF', '사용 가이드 문서입니다. 회원만 다운로드 가능합니다.'],
                ['디자인 토큰 시트', '95개 CSS 변수 정리 시트입니다.'],
            ],
            'gallery' => [
                ['Aqua 테마 스크린샷', '바다 같은 시원한 블루 톤이 인상적입니다.'],
                ['Mint 테마 미리보기', '건강/뷰티 도메인에 잘 어울려요.'],
                ['Olive 테마 모음', '에디토리얼 느낌 좋네요.'],
                ['Coral 테마 헤더', '비비드한 컬러가 매력적입니다.'],
            ],
        ];

        $sampleComments = [
            '좋은 글 감사합니다 :)',
            '저도 같은 생각입니다.',
            '도움이 많이 됐어요!',
            '추가 정보 공유 부탁드려요.',
            '잘 봤습니다 👍',
        ];

        foreach ($defs as $def) {
            $board = Board::updateOrCreate(
                ['tenant_id' => $tenant->id, 'slug' => $def['slug']],
                [
                    'name' => $def['name'],
                    'description' => $def['description'],
                    'group_name' => $def['group_name'],
                    'skin' => $def['skin'],
                    'perms_read' => $def['perms_read'],
                    'perms_write' => $def['perms_write'],
                    'perms_comment' => $def['perms_comment'],
                    'perms_download' => $def['perms_download'],
                    'is_active' => true,
                    'sort_order' => $def['sort_order'],
                ]
            );

            // 카테고리
            $categoryIds = [];
            foreach ($def['categories'] as $i => $catName) {
                $cat = BoardCategory::updateOrCreate(
                    ['board_id' => $board->id, 'slug' => Str::slug($catName, '-', 'ko') ?: 'cat-'.($i + 1)],
                    ['name' => $catName, 'sort_order' => $i + 1]
                );
                $categoryIds[] = $cat->id;
            }

            // 샘플 글
            $titles = $sampleTitles[$def['slug']] ?? [];
            foreach ($titles as $idx => [$title, $content]) {
                $catId = $categoryIds ? $categoryIds[$idx % count($categoryIds)] : null;
                $post = Post::create([
                    'tenant_id' => $tenant->id,
                    'board_id' => $board->id,
                    'category_id' => $catId,
                    'user_id' => null,
                    'guest_name' => '관리자',
                    'guest_password_hash' => null,
                    'title' => $title,
                    'content' => $content."\n\n— 데모용 시드 게시물 ($idx)",
                    'excerpt' => mb_substr($content, 0, 200),
                    'is_notice' => $def['slug'] === 'notice' && $idx === 0,
                    'is_secret' => false,
                    'is_html' => false,
                    'status' => 'published',
                    'view_count' => rand(10, 500),
                    'like_count' => rand(0, 30),
                    'ip' => '127.0.0.1',
                    'published_at' => now()->subDays(rand(0, 20))->subHours(rand(0, 23)),
                ]);

                // 댓글 0-3 개
                $cn = rand(0, 3);
                for ($c = 0; $c < $cn; $c++) {
                    PostComment::create([
                        'tenant_id' => $tenant->id,
                        'post_id' => $post->id,
                        'parent_id' => null,
                        'user_id' => null,
                        'guest_name' => '회원'.rand(100, 999),
                        'guest_password_hash' => null,
                        'content' => $sampleComments[array_rand($sampleComments)],
                        'is_secret' => false,
                        'ip' => '127.0.0.1',
                    ]);
                    $post->increment('comment_count');
                }
            }

            $board->update(['post_count' => $board->posts()->count()]);
        }

        $this->command?->info('DefaultBoardsSeeder: 5 boards + samples seeded for tenant '.$tenant->domain);
    }
}
