<?php

namespace App\Providers;

use App\Models\Boards\File;
use App\Models\Boards\Post;
use App\Models\Tenants\Department;
use App\Models\User;
use App\Observers\FileObserver;
use App\Services\SidebarMenuService;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        // SidebarMenuService 싱글턴 등록
        $this->app->singleton(SidebarMenuService::class);
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        // File Observer: 파일 생성/삭제 시 테넌트 저장소 사용량 자동 업데이트
        File::observe(FileObserver::class);

        // Morph Map: Polymorphic 관계 모델 등록
        Relation::enforceMorphMap([
            'user' => User::class,
            'post' => Post::class,
            'department' => Department::class,
        ]);

        // 일회성 메뉴명 변경: 협력사관리 → 거래처 관리
        if (! Cache::has('menu_rename_partner_to_vendor')) {
            $updated = DB::table('menus')
                ->where('tenant_id', 1)
                ->whereIn('name', ['협력사관리', '협력사 관리'])
                ->update(['name' => '거래처 관리']);
            if ($updated > 0) {
                Cache::put('menu_rename_partner_to_vendor', true, now()->addYear());
            }
        }

        // 사이드바에 메뉴 데이터 전달
        View::composer('partials.sidebar', function ($view) {
            $menuService = app(SidebarMenuService::class);
            $menusBySection = $menuService->getMenusBySection();

            $view->with([
                'mainMenus' => $menusBySection['main'],
                'toolsMenus' => $menusBySection['tools'],
                'labsMenus' => $menusBySection['labs'],
            ]);
        });
    }
}
