<?php

namespace App\Imports;

use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
use App\Models\Enums\ObjectAction;
use App\Models\Plan;
use App\Models\Project;
use App\Models\ProjectAsset;
use App\Models\ProjectRequirement;
use App\Models\Requirement;
use App\Repositories\ActionRepository;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class RequirementImport implements ToCollection, WithHeadingRow
{
    use ImportValidatorHelper;

    public function collection(Collection $collection): void
    {
        $this->validator($collection);

        foreach ($collection as $item) {
            $requirement = new Requirement();

            $requirement->mergeFillable([
                'company_id', 'created_by',
            ]);

            $requirement->fill([
                ...$item->toArray(),
                'company_id' => Auth::user()->company_id,
                'created_by' => Auth::id(),
                'mailto' => [],
            ]);
            $requirement->save();

            $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
            foreach ($projectIDs as $projectID) {
                ProjectRequirement::query()->firstOrCreate([
                    'project_id' => $projectID,
                    'requirement_id' => $requirement->id,
                    'asset_id' => $item['asset_id'] ?? null,
                    'requirement_group_id'=> $item['requirement_group_id'] ?? null,
                ]);
            }

            ActionRepository::createRequirement(
                $requirement, ObjectAction::CREATED
            );
        }
    }

    protected function validator(Collection $collection)
    {
        $this->validatorByCollection($collection, (new CreateOrUpdateRequest())->rules(), additional: function ($item) {
            if (! $item['asset_id']) {
                return "Asset cannot be empty.";
            }

            if ($item['plan_id']) {
                $plan = Plan::query()->where("asset_id", $item['asset_id'])->where("id", $item['plan_id'])->first();
                if (! $plan) {
                    return "Plans are not assets.";
                }
            }

            $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
            if (! $projectIDs) {
                return null;
            }

            $count = ProjectAsset::query()->where("asset_id", $item['asset_id'])->whereIn('id', $projectIDs)->count();
            if ($count != count($projectIDs)) {
                return sprintf('Please select the items that are assets. Asset ID:%s, Project IDs: %s', $item['asset_id'], $item['project_ids']);
            }

            return null;
        });
    }
}