<?php

declare(strict_types=1);

namespace Database\Seeders;

use App\Models\Board;
use App\Models\Page;
use App\Models\Post;
use App\Models\Tenant;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;

/**
 * DefaultSiteTemplateSeeder — 신규 ZIP 설치 후 자동 적용되는 깔끔한 기본 사이트.
 *
 * 그누보드 install.php 의 "설치 완료 → 기본 페이지 자동 노출" 패리티.
 *
 * 시드 항목:
 *   - Pages 4개 (Home / About / Contact / Privacy)
 *   - Boards 2개 (공지사항 / 자유게시판) + 환영 글 각 1개
 *   - Menu (Top nav 4개) — tenants.settings JSON 에 저장
 *   - Theme (Aqua / Light) — tenants.settings JSON 에 저장
 *   - Hero / Features / CTA / Footer 샘플 블록 (Home meta.blocks)
 *
 * 데모 데이터 (마켓 / 쇼핑몰 / AI 등) 는 포함하지 않음 — 신규 사용자에게 노출 X.
 */
class DefaultSiteTemplateSeeder extends Seeder
{
    public function run(): void
    {
        $tenant = $this->ensureTenant();
        app()->instance('currentTenant', $tenant);

        $this->seedPages($tenant);
        $this->seedBoards($tenant);
        $this->applyMenuAndTheme($tenant);
    }

    private function ensureTenant(): Tenant
    {
        $appUrl = (string) config('app.url', URL::to('/'));
        $domain = parse_url($appUrl, PHP_URL_HOST) ?: 'localhost';

        $tenant = Tenant::withoutGlobalScopes()
            ->where('domain', $domain)
            ->first();

        if (! $tenant) {
            // 호환성 — 기존 시더의 데모 테넌트가 있으면 그것을 사용
            $tenant = Tenant::withoutGlobalScopes()->orderBy('created_at')->first();
        }

        if (! $tenant) {
            $tenant = Tenant::withoutGlobalScopes()->create([
                'id' => (string) Str::uuid(),
                'name' => 'W·Dot Site',
                'domain' => $domain,
                'status' => Tenant::STATUS_ACTIVE,
                'plan' => Tenant::PLAN_FREE,
            ]);
        }

        if ($tenant->status !== Tenant::STATUS_ACTIVE) {
            $tenant->update(['status' => Tenant::STATUS_ACTIVE]);
        }

        return $tenant;
    }

    private function seedPages(Tenant $tenant): void
    {
        $pages = [
            [
                'slug' => 'home',
                'title' => '환영합니다',
                'content' => $this->homeContent(),
                'meta' => [
                    'is_homepage' => true,
                    'blocks' => $this->homeBlocks(),
                    'seo' => [
                        'description' => 'W·Dot CMS 로 만든 웹사이트입니다.',
                    ],
                ],
            ],
            [
                'slug' => 'about',
                'title' => '회사 소개',
                'content' => $this->aboutContent(),
                'meta' => ['hint' => '관리자 페이지에서 회사 정보를 수정하세요.'],
            ],
            [
                'slug' => 'contact',
                'title' => '연락처',
                'content' => $this->contactContent(),
                'meta' => ['has_form' => true],
            ],
            [
                'slug' => 'privacy',
                'title' => '개인정보 처리방침',
                'content' => $this->privacyContent(),
                'meta' => ['system' => true],
            ],
        ];

        foreach ($pages as $p) {
            Page::withoutGlobalScopes()->updateOrCreate(
                ['tenant_id' => $tenant->id, 'slug' => $p['slug']],
                [
                    'title' => $p['title'],
                    'content' => $p['content'],
                    'meta' => $p['meta'],
                    'status' => 'published',
                    'published_at' => now(),
                ]
            );
        }
    }

    private function seedBoards(Tenant $tenant): void
    {
        $defs = [
            [
                'slug' => 'notice',
                'name' => '공지사항',
                'group_name' => '운영',
                'description' => '운영진이 게시하는 공지사항입니다.',
                'skin' => 'list',
                'perms_read' => 'guest',
                'perms_write' => 'admin',
                'perms_comment' => 'member',
                'perms_download' => 'guest',
                'sort_order' => 1,
                'welcome_title' => 'W·Dot 설치를 환영합니다',
                'welcome_body' => "축하합니다! W·Dot CMS 설치가 완료되었습니다.\n\n이 게시판은 공지사항용 기본 게시판입니다. 관리자 페이지(/admin)에서 게시판 설정과 권한을 자유롭게 변경하실 수 있으며, 이 환영 글은 삭제 후 직접 작성하시기 바랍니다.\n\n— W·Dot 팀 드림",
            ],
            [
                'slug' => 'free',
                'name' => '자유게시판',
                'group_name' => '커뮤니티',
                'description' => '자유롭게 이야기를 나누는 공간입니다.',
                'skin' => 'list',
                'perms_read' => 'guest',
                'perms_write' => 'member',
                'perms_comment' => 'member',
                'perms_download' => 'member',
                'sort_order' => 10,
                'welcome_title' => '자유게시판 — 첫 글입니다',
                'welcome_body' => "이 글은 기본 시드 글입니다. 삭제 후 직접 작성하세요.\n\n자유게시판은 회원이 자유롭게 글을 작성할 수 있는 공간입니다. 권한 / 스킨 / 카테고리는 관리자 페이지에서 변경 가능합니다.",
            ],
        ];

        foreach ($defs as $def) {
            $board = Board::withoutGlobalScopes()->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'],
                ]
            );

            // 환영 글 — 게시판당 1개만 (중복 방지: title 기준)
            $exists = Post::withoutGlobalScopes()
                ->where('board_id', $board->id)
                ->where('title', $def['welcome_title'])
                ->exists();

            if (! $exists) {
                Post::withoutGlobalScopes()->create([
                    'id' => (string) Str::uuid(),
                    'tenant_id' => $tenant->id,
                    'board_id' => $board->id,
                    'user_id' => null,
                    'guest_name' => 'W·Dot',
                    'title' => $def['welcome_title'],
                    'content' => $def['welcome_body'],
                    'excerpt' => Str::limit(strip_tags($def['welcome_body']), 180),
                    'is_notice' => $def['slug'] === 'notice',
                    'status' => 'published',
                    'meta' => ['source' => 'default-site-template'],
                ]);

                $board->increment('post_count');
            }
        }
    }

    private function applyMenuAndTheme(Tenant $tenant): void
    {
        $settings = $tenant->settings ?? [];

        $settings['menu'] = [
            'top' => [
                ['label' => '홈',       'url' => '/',         'order' => 1],
                ['label' => '회사소개', 'url' => '/about',    'order' => 2],
                ['label' => '게시판',   'url' => '/community/notice', 'order' => 3],
                ['label' => '연락처',   'url' => '/contact',  'order' => 4],
            ],
            'footer' => [
                ['label' => '개인정보처리방침', 'url' => '/privacy', 'order' => 1],
            ],
        ];

        $settings['theme'] = [
            'preset' => 'aqua',
            'mode' => 'light',
            'tokens' => [
                'primary' => '#0f5fa8',
                'font' => 'Pretendard',
            ],
        ];

        $settings['site'] = array_merge($settings['site'] ?? [], [
            'template' => 'default-site-template-v1',
            'seeded_at' => now()->toIso8601String(),
        ]);

        $tenant->update(['settings' => $settings]);
    }

    // -------- 페이지 콘텐츠 --------

    private function homeContent(): string
    {
        return <<<'HTML'
<section class="hero">
  <h1>W·Dot CMS 에 오신 것을 환영합니다</h1>
  <p>한국형 LLM 통합 노코드 CMS — 5분 설치, 무한 확장.</p>
  <p>이 페이지는 기본 사이트 템플릿입니다. <a href="/admin">관리자 페이지</a>에서 자유롭게 수정하세요.</p>
</section>
HTML;
    }

    private function homeBlocks(): array
    {
        return [
            [
                'type' => 'hero.centered',
                'props' => [
                    'eyebrow' => 'Welcome',
                    'title' => 'W·Dot CMS 에 오신 것을 환영합니다',
                    'subtitle' => '한국형 LLM 통합 노코드 CMS — 5분 설치, 무한 확장',
                    'primary_cta' => ['label' => '관리자 로그인', 'href' => '/admin'],
                    'secondary_cta' => ['label' => '게시판 보기', 'href' => '/community/notice'],
                ],
            ],
            [
                'type' => 'features.grid',
                'props' => [
                    'title' => '주요 기능',
                    'items' => [
                        ['icon' => 'cube',       'title' => '57 블록',   'body' => '드래그·드롭 노코드 빌더로 어떤 페이지든 빠르게 구성하세요.'],
                        ['icon' => 'palette',    'title' => '5 테마',    'body' => 'Aqua / Mint / Olive / Coral / Slate — 도메인에 맞춰 즉시 전환.'],
                        ['icon' => 'shield',     'title' => '28 ISMS',   'body' => 'KISA ISMS-P 통제 28개 내장 — 한국형 컴플라이언스 준비 완료.'],
                        ['icon' => 'sparkles',   'title' => 'LLM 통합',  'body' => 'AI Studio 로 콘텐츠 생성·번역·요약을 한 번에.'],
                    ],
                ],
            ],
            [
                'type' => 'cta.banner',
                'props' => [
                    'title' => '지금 바로 시작하세요',
                    'subtitle' => '관리자 페이지에서 콘텐츠를 추가하고 사이트를 운영하세요.',
                    'cta' => ['label' => '관리자 페이지 →', 'href' => '/admin'],
                ],
            ],
            [
                'type' => 'footer.simple',
                'props' => [
                    'columns' => [
                        ['title' => '사이트', 'links' => [
                            ['label' => '회사소개', 'href' => '/about'],
                            ['label' => '게시판',   'href' => '/community/notice'],
                            ['label' => '연락처',   'href' => '/contact'],
                        ]],
                        ['title' => '약관', 'links' => [
                            ['label' => '개인정보처리방침', 'href' => '/privacy'],
                        ]],
                    ],
                    'copyright' => '© 2026 W·Dot CMS Site',
                ],
            ],
        ];
    }

    private function aboutContent(): string
    {
        return <<<'HTML'
<h2>회사 소개</h2>
<p>여기에 회사 또는 단체 소개 문구를 작성하세요.</p>
<ul>
  <li>설립 연도, 비전, 핵심 가치</li>
  <li>주요 사업 영역</li>
  <li>오시는 길</li>
</ul>
<p><em>이 내용은 관리자 페이지(/admin) → 페이지 → 회사 소개에서 편집 가능합니다.</em></p>
HTML;
    }

    private function contactContent(): string
    {
        return <<<'HTML'
<h2>연락처</h2>
<p>아래 양식으로 문의를 보내주시면 빠르게 답변드리겠습니다.</p>
<p>전화: 02-0000-0000<br>이메일: hello@example.com<br>주소: 서울특별시 ...</p>
<p><em>실제 연락처 정보로 교체하세요.</em></p>
HTML;
    }

    private function privacyContent(): string
    {
        return <<<'HTML'
<h2>개인정보 처리방침</h2>
<p>본 사이트는 「개인정보 보호법」(PIPA)에 따라 이용자의 개인정보를 보호하고 있습니다.</p>
<h3>1. 수집 항목</h3>
<ul><li>회원가입 시: 이메일, 이름</li><li>서비스 이용 시: 접속 IP, 쿠키</li></ul>
<h3>2. 수집 목적</h3>
<p>회원 식별, 서비스 제공, 부정 이용 방지.</p>
<h3>3. 보관 기간</h3>
<p>회원 탈퇴 시 즉시 파기. 단, 관계 법령에 따라 일정 기간 보관할 수 있습니다.</p>
<p><em>구체적인 내용은 관리자가 직접 보완하세요.</em></p>
HTML;
    }
}
