<?php

namespace App\Services\Client;

use App\Models\AgentInfo;
use App\Models\CoachUser;
use App\Models\Project;
use App\Models\ProjectCate;

class ProjectService
{
    /**
     * 获取项目列表
     */
    public function getProjectList($areaCode, $projectCateId = null)
    {
        // 根据区域代码获取代理商
        $agent = $this->findAvailableAgent($areaCode);

        // 获取项目列表
        if ($agent) {
            dd($agent->cates());
            $projects = Project::where('state', 'enable')
                ->where('agent_id', $agent->id)
                ->paginate(10);
        } else {
            $projectCate = ProjectCate::find($projectCateId);
            $projects = $projectCate?->services;
        }

        return $projects;
    }

    /**
     * 获取项目详情
     */
    public function getProjectDetail($projectId, $areaCode)
    {
        // 根据区域代码获取代理商
        $agent = $this->findAvailableAgent($areaCode);

        // 查询系统项目
        $project = Project::where('state', 'enable')->find($projectId);

        if (! $project) {
            throw new \Exception('项目不存在');
        }

        if ($agent) {
            // 查询代理商项目
            $project = $agent->projects()->where('project_id', $projectId)->first();
        }

        return $project;
    }

    /**
     * 获取技师开通的项目列表
     */
    public function getCoachProjectList($coachId, $areaCode, $projectCateId)
    {
        // 查询技师信息
        $coach = CoachUser::where('id', $coachId)
            ->where('state', 'enable')
            ->find($coachId);

        if (! $coach) {
            throw new \Exception('技师不存在');
        }

        $coachInfo = $coach->info;
        if (! $coachInfo) {
            throw new \Exception('技师信息不存在');
        }

        if ($coachInfo->state !== 'approved') {
            throw new \Exception('技师未通过审核');
        }

        $coachQual = $coach->qual;
        if (! $coachQual) {
            throw new \Exception('技师资格证书不存在');
        }

        if ($coachQual->state !== 'approved') {
            throw new \Exception('技师资格证书未通过审核');
        }

        $coachReal = $coach->real;

        if (! $coachReal) {
            throw new \Exception('技师实名认证记录不存在');
        }

        if ($coachReal->state !== 'approved') {
            throw new \Exception('技师实名认证未通过审核');
        }

        // 获取技师开通的项目ID列表
        $projectIds = $coach->projects()->where('state', 'enable')->pluck('project_id');

        // 根据区域代码获取代理商
        $agent = $this->findAvailableAgent($areaCode);

        if ($agent) {
            $agentCate = $agent->cates()->where('project_cate_id', $projectCateId)->first();
            $projectIds = $agentCate->projects()->whereIn('project_id', $projectIds)->pluck('project_id');
        }

        return $coach->projects()->with('basicInfo')->whereIn('project_id', $projectIds)->get();
    }

    /**
     * 递归查找可用的代理商
     *
     * @param  string  $areaCode  区域代码
     * @return Agent|null
     */
    private function findAvailableAgent($areaCode)
    {
        // 先查找当前区域的代理商
        $agent = AgentInfo::where('area_code', $areaCode)
            ->where('state', 'enable')
            ->first();

        if ($agent) {
            return $agent;
        }

        // 如果找不到，且区域代码长度大于2，则向上查找
        if (strlen($areaCode) > 2) {
            // 去掉最后两位，获取上级区域代码
            $parentAreaCode = substr($areaCode, 0, -2);

            return $this->findAvailableAgent($parentAreaCode);
        }

        return null;
    }
}
