<?php

namespace App\Http\Controllers\Sales;

use App\Http\Controllers\Controller;
use App\Models\Sales\SalesScenarioChecklist;
use App\Models\Sales\SalesTenantManagement;
use App\Models\Sales\TenantProspect;
use App\Models\Tenants\Tenant;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;

/**
 * 영업 시나리오 관리 컨트롤러
 *
 * 영업 진행 및 매니저 상담 프로세스의 시나리오 모달과 체크리스트를 관리합니다.
 * 데이터는 sales_scenario_checklists 테이블에 저장됩니다.
 */
class SalesScenarioController extends Controller
{
    /**
     * 영업 시나리오 모달 뷰
     */
    public function salesScenario(int $tenantId, Request $request): View|Response
    {
        $tenant = Tenant::findOrFail($tenantId);
        $steps = config('sales_scenario.sales_steps');
        $currentStep = (int) $request->input('step', 1);
        $icons = config('sales_scenario.icons');

        // 테넌트 영업 관리 정보 조회 또는 생성
        $management = SalesTenantManagement::findOrCreateByTenant($tenantId);

        // 체크리스트 진행 상태 조회 (DB에서)
        $progress = SalesScenarioChecklist::calculateProgress($tenantId, 'sales', $steps);

        // 진행률 업데이트
        $management->updateProgress('sales', $progress['percentage']);

        // HTMX 요청이면 단계 콘텐츠만 반환
        if ($request->header('HX-Request') && $request->has('step')) {
            return view('sales.modals.scenario-step', [
                'tenant' => $tenant,
                'steps' => $steps,
                'currentStep' => $currentStep,
                'step' => collect($steps)->firstWhere('id', $currentStep),
                'progress' => $progress,
                'scenarioType' => 'sales',
                'icons' => $icons,
                'management' => $management,
            ]);
        }

        return view('sales.modals.scenario-modal', [
            'tenant' => $tenant,
            'steps' => $steps,
            'currentStep' => $currentStep,
            'progress' => $progress,
            'scenarioType' => 'sales',
            'icons' => $icons,
            'management' => $management,
        ]);
    }

    /**
     * 매니저 시나리오 모달 뷰
     */
    public function managerScenario(int $tenantId, Request $request): View|Response
    {
        $tenant = Tenant::findOrFail($tenantId);
        $steps = config('sales_scenario.manager_steps');
        $currentStep = (int) $request->input('step', 1);
        $icons = config('sales_scenario.icons');

        // 테넌트 영업 관리 정보 조회 또는 생성
        $management = SalesTenantManagement::findOrCreateByTenant($tenantId);

        // 체크리스트 진행 상태 조회 (DB에서)
        $progress = SalesScenarioChecklist::calculateProgress($tenantId, 'manager', $steps);

        // 진행률 업데이트
        $management->updateProgress('manager', $progress['percentage']);

        // HTMX 요청이면 단계 콘텐츠만 반환
        if ($request->header('HX-Request') && $request->has('step')) {
            return view('sales.modals.scenario-step', [
                'tenant' => $tenant,
                'steps' => $steps,
                'currentStep' => $currentStep,
                'step' => collect($steps)->firstWhere('id', $currentStep),
                'progress' => $progress,
                'scenarioType' => 'manager',
                'icons' => $icons,
                'management' => $management,
            ]);
        }

        return view('sales.modals.scenario-modal', [
            'tenant' => $tenant,
            'steps' => $steps,
            'currentStep' => $currentStep,
            'progress' => $progress,
            'scenarioType' => 'manager',
            'icons' => $icons,
            'management' => $management,
        ]);
    }

    /**
     * 체크리스트 항목 토글 (HTMX)
     */
    public function toggleChecklist(Request $request): JsonResponse
    {
        $request->validate([
            'tenant_id' => 'required|integer|exists:tenants,id',
            'scenario_type' => 'required|in:sales,manager',
            'step_id' => 'required|integer',
            'checkpoint_id' => 'required|string',
            'checked' => 'required|boolean',
        ]);

        $tenantId = $request->input('tenant_id');
        $scenarioType = $request->input('scenario_type');
        $stepId = $request->input('step_id');
        $checkpointId = $request->input('checkpoint_id');
        $checked = $request->boolean('checked');

        // 체크리스트 토글 (DB에 저장)
        SalesScenarioChecklist::toggle(
            $tenantId,
            $scenarioType,
            $stepId,
            $checkpointId,
            $checked,
            auth()->id()
        );

        // 진행률 재계산
        $steps = config("sales_scenario.{$scenarioType}_steps");
        $progress = SalesScenarioChecklist::calculateProgress($tenantId, $scenarioType, $steps);

        // 테넌트 영업 관리 정보 업데이트
        $management = SalesTenantManagement::findOrCreateByTenant($tenantId);
        $management->updateProgress($scenarioType, $progress['percentage']);

        return response()->json([
            'success' => true,
            'progress' => $progress,
            'checked' => $checked,
        ]);
    }

    /**
     * 진행률 조회
     */
    public function getProgress(int $tenantId, string $type): JsonResponse
    {
        $steps = config("sales_scenario.{$type}_steps");
        $progress = SalesScenarioChecklist::calculateProgress($tenantId, $type, $steps);

        return response()->json([
            'success' => true,
            'progress' => $progress,
        ]);
    }

    // ============================================
    // 가망고객(Prospect) 기반 메서드
    // ============================================

    /**
     * 가망고객 영업 시나리오 모달 뷰
     */
    public function prospectSalesScenario(int $prospectId, Request $request): View|Response
    {
        $prospect = TenantProspect::findOrFail($prospectId);
        $steps = config('sales_scenario.sales_steps');
        $currentStep = (int) $request->input('step', 1);
        $icons = config('sales_scenario.icons');
        $readonly = $request->boolean('readonly', false);

        // 가망고객 영업 관리 정보 조회 또는 생성
        $management = SalesTenantManagement::findOrCreateByProspect($prospectId);

        // 체크리스트 진행 상태 조회 (DB에서)
        $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, 'sales', $steps);

        // 진행률 업데이트
        $management->updateProgress('sales', $progress['percentage']);

        // HTMX 요청이면 단계 콘텐츠만 반환
        if ($request->header('HX-Request') && $request->has('step')) {
            return view('sales.modals.scenario-step', [
                'prospect' => $prospect,
                'steps' => $steps,
                'currentStep' => $currentStep,
                'step' => collect($steps)->firstWhere('id', $currentStep),
                'progress' => $progress,
                'scenarioType' => 'sales',
                'icons' => $icons,
                'management' => $management,
                'isProspect' => true,
                'readonly' => $readonly,
            ]);
        }

        return view('sales.modals.scenario-modal', [
            'prospect' => $prospect,
            'steps' => $steps,
            'currentStep' => $currentStep,
            'progress' => $progress,
            'scenarioType' => 'sales',
            'icons' => $icons,
            'management' => $management,
            'isProspect' => true,
            'readonly' => $readonly,
        ]);
    }

    /**
     * 가망고객 매니저 시나리오 모달 뷰
     */
    public function prospectManagerScenario(int $prospectId, Request $request): View|Response
    {
        $prospect = TenantProspect::findOrFail($prospectId);
        $steps = config('sales_scenario.manager_steps');
        $currentStep = (int) $request->input('step', 1);
        $icons = config('sales_scenario.icons');
        $readonly = $request->boolean('readonly', false);

        // 가망고객 영업 관리 정보 조회 또는 생성
        $management = SalesTenantManagement::findOrCreateByProspect($prospectId);

        // 체크리스트 진행 상태 조회 (DB에서)
        $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, 'manager', $steps);

        // 진행률 업데이트
        $management->updateProgress('manager', $progress['percentage']);

        // HTMX 요청이면 단계 콘텐츠만 반환
        if ($request->header('HX-Request') && $request->has('step')) {
            return view('sales.modals.scenario-step', [
                'prospect' => $prospect,
                'steps' => $steps,
                'currentStep' => $currentStep,
                'step' => collect($steps)->firstWhere('id', $currentStep),
                'progress' => $progress,
                'scenarioType' => 'manager',
                'icons' => $icons,
                'management' => $management,
                'isProspect' => true,
                'readonly' => $readonly,
            ]);
        }

        return view('sales.modals.scenario-modal', [
            'prospect' => $prospect,
            'steps' => $steps,
            'currentStep' => $currentStep,
            'progress' => $progress,
            'scenarioType' => 'manager',
            'icons' => $icons,
            'management' => $management,
            'isProspect' => true,
            'readonly' => $readonly,
        ]);
    }

    /**
     * 가망고객 체크리스트 항목 토글 (HTMX)
     */
    public function toggleProspectChecklist(Request $request): JsonResponse
    {
        $request->validate([
            'prospect_id' => 'required|integer|exists:tenant_prospects,id',
            'scenario_type' => 'required|in:sales,manager',
            'step_id' => 'required|integer',
            'checkpoint_id' => 'required|string',
            'checked' => 'required|boolean',
        ]);

        $prospectId = $request->input('prospect_id');
        $scenarioType = $request->input('scenario_type');
        $stepId = $request->input('step_id');
        $checkpointId = $request->input('checkpoint_id');
        $checked = $request->boolean('checked');

        // 체크리스트 토글 (DB에 저장)
        SalesScenarioChecklist::toggleByProspect(
            $prospectId,
            $scenarioType,
            $stepId,
            $checkpointId,
            $checked,
            auth()->id()
        );

        // 진행률 재계산
        $steps = config("sales_scenario.{$scenarioType}_steps");
        $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, $scenarioType, $steps);

        // 영업 관리 정보 업데이트
        $management = SalesTenantManagement::findOrCreateByProspect($prospectId);
        $management->updateProgress($scenarioType, $progress['percentage']);

        // 가망고객 상태 조회 (자동 전환이 발생했을 수 있음)
        $prospect = TenantProspect::find($prospectId);
        $fullProgress = SalesScenarioChecklist::getProspectProgress($prospectId);

        return response()->json([
            'success' => true,
            'progress' => $progress,
            'checked' => $checked,
            'prospect_status' => $prospect?->status,
            'prospect_status_label' => $prospect?->status_label,
            'is_converted' => $prospect?->status === TenantProspect::STATUS_CONVERTED,
            'full_progress' => $fullProgress,
        ]);
    }

    /**
     * 가망고객 진행률 조회
     */
    public function getProspectProgress(int $prospectId, string $type): JsonResponse
    {
        $steps = config("sales_scenario.{$type}_steps");
        $progress = SalesScenarioChecklist::calculateProgressByProspect($prospectId, $type, $steps);

        return response()->json([
            'success' => true,
            'progress' => $progress,
        ]);
    }
}
