<?php
/**
 * Created by IntelliJ IDEA.
 * User: kelyliang
 * Date: 2024/3/20
 * Time: 下午 02:32
 */

namespace App\Http\Controllers\API;


use App\Mail\CompanyAction;
use App\Models\CaptchaMail;
use App\Models\Enums\FileObjectType;
use App\Models\File;
use App\Models\Role;
use App\Models\Scopes\CompanyScope;
use App\Services\Notification\ActionEmail\ActionEmailService;
use Illuminate\Mail\Mailable;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use function App\Http\Controllers\badRequest;
use App\Http\Controllers\Controller;

use App\Http\Requests\API\Company\ActionRequest;
use App\Http\Requests\API\Company\CreateOrUpdateRequest;
use App\Http\Resources\API\CompanyResource;
use App\Models\Company;
use App\Models\User;
use App\Services\File\FileAssociationService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\Enums\CompanyReviewStatus;

class CompanyController extends Controller
{
    public function index(Request $request)
    {
        $pageSize=$request->get('page_size') ?? 0;
        if(Auth::user()->super_admin){
            $company=Company::query()->filter($request->all())->paginate($pageSize);
            make_display_id($company,$pageSize);
            return CompanyResource::collection($company);
        }else{
            $companyId=Auth::user()->company->id;
            $company=Company::query()->filter($request->all())->where('id',$companyId)->paginate($pageSize);
            make_display_id($company,$pageSize);
            return CompanyResource::collection($company);
        }

    }

    public function publicSearch(Request $request){
        $company=Company::query()->filter($request->all())->where('id',Auth::user()->company->id)->get();
        return CompanyResource::collection($company);
    }


    public function store(CreateOrUpdateRequest $request)
    {
        $company = new Company();

        $company->fill([
             ...$request->all(),
             'review_status'=>CompanyReviewStatus::APPROVED,
             'exp_date'=> $request->exp_date === null ? Carbon::now()->addYear()->toDateString():$request->exp_date,
             'parent_id' => Auth::user()->super_admin ? 0 : Auth::user()->company->id,
        ]);

        $company->save();

        return $this->created();
    }

    public function show(string $id)
    {
        $companyId=Auth::user()->company->id;
        if(empty(Auth::user()->super_admin)){
            if($companyId!=$id){
                return $this->forbidden("You are not a user under this company");
            }
        }

        $field = Company::query()->findOrFail($id);

        return new CompanyResource($field);
    }

    public function update(Request $request,string $id){
        $company = Company::findOrFail($id);

        $company->email =$request->email;
        $company->exp_date =$request->exp_date;
        $company->save();

        return $this->noContent();
    }

    public function structure(Request $request)
    {
        $company = Company::where(function ($query){
            $query->when(!Auth::user()->super_admin, fn($query) => $query->where("id", Auth::user()->company->id)->orWhere('parent_id',Auth::user()->company->id));
        })->filter($request->all())->get();

        return CompanyResource::collection($company);
    }

    public function destroy(string $id)
    {
        $company = Company::findOrFail($id);
        $company->delete();

        return $this->noContent();
    }

    //注册用户时注册公司
    public function registerCompany(FileAssociationService $service,CreateOrUpdateRequest $request)
    {
        $company = new Company();

        $company->fill([
            ...$request->all(),
        ]);

        $company->save();

        $this->filesAssociationCompany($request->get("file_ids", []), FileObjectType::COMPANY,$company->id);


        return $this->created();
    }

    public function filesAssociationCompany(array $fileIds, FileObjectType $fileObjectType,string $companyId){
        if (! $fileIds) {
            return;
        }
        foreach ($fileIds as $fileId){
            $file=File::query()
                ->where('object_type',$fileObjectType->value)
                ->whereNull("object_id")
                ->where('id',$fileId)
                ->first();
            $file->company_id=$companyId;
            $file->object_id =$companyId;
            $file->save();
        }

    }

    //公司审核
    public function action(ActionRequest $request){
        $company = Company::findOrFail($request->id);
        $status=$request->get('status');
        $expDate=$request->get('exp_date');
        $roleId=$request->get('role_id');
        $rejectReason=$request->get('reject_reason');
        $user = new User();
        //通过审核->改变公司状态->设置公司过期时间->最后生成默认账户
        DB::transaction(function () use($status,$expDate,$company,$user,$roleId,$rejectReason){
        if ($status == 1){
            //1.改变公司状态->设置公司过期时间
            $company->review_status=CompanyReviewStatus::APPROVED;
            $company->exp_date = $expDate === null ? Carbon::now()->addYear()->toDateString():$expDate;
            //2.生成默认账户
            $user->name='admin_'.$company->name;
            $user->email=$company->email;
            $user->username=$company->email;
            $user->company_id=$company->id;
            $user->password=Hash::make('admin@#123');
            $user->role_id=$roleId;
            //TODO 此处给的默认角色为硬编码,暂未设置默认角色为哪个
            $role = Role::query()->findOrFail($roleId);
            $user->syncRoles($role);
//            $user->role_id=6;
//            $user->syncRoles(6);
            $user->save();
            $company->save();
            Mail::to($company->email)->send(new CompanyAction($company,$user,$rejectReason??''));

        }else{
            $company->review_status=CompanyReviewStatus::REJECTED;
            $company->save();
            Mail::to($company->email)->send(new CompanyAction($company,$user,$rejectReason??''));
            $company->delete();
        }
        });
        return $this->noContent();

    }




}