<?php

namespace App\Services;

use App\Exceptions\ApiHttpException;
use App\Models\CvEntry;
use App\Models\User;
use Exception;
use Illuminate\Support\Facades\DB;

class CvEntriesService
{
    public function getUserEntries(User $user)
    {
        $cvEntries = CvEntry::where('user_id', $user->id)->get();

        return $cvEntries;
    }

    public function findById(User $user, int $id)
    {
        $cvEntry = CvEntry::where('user_id', $user->id)->where('id', $id)->first();
        if (is_null($cvEntry)) {
            throw new ApiHttpException(404, trans('frontend.exception_cv_entry_not_found'));
        }

        return $cvEntry;
    }

    public function create(User $user, array $data): CvEntry
    {
        DB::beginTransaction();
        try {
            $cvEntry = new CvEntry();
            $cvEntry->company = $data['company'];
            $cvEntry->position = $data['position'];
            $cvEntry->start_date = $data['startDate'];
            if (isset($data['endDate'])) {
                $cvEntry->end_date = $data['endDate'];
            }
            $cvEntry->is_current = $data['isCurrent'];
            $cvEntry->user()->associate($user);
            $cvEntry->save();
            DB::commit();

            return $cvEntry;
        } catch (Exception $e) {
            DB::rollBack();
            throw $e;
        }
    }

    public function update(User $user, array $data, int $id): CvEntry
    {
        $cvEntry = $this->findById($user, $id);
        DB::beginTransaction();
        try {
            $cvEntry->company = $data['company'];
            $cvEntry->position = $data['position'];
            $cvEntry->start_date = $data['startDate'];
            if (isset($data['endDate'])) {
                $cvEntry->end_date = $data['endDate'];
            }
            $cvEntry->is_current = $data['isCurrent'];
            $cvEntry->save();
            DB::commit();

            return $cvEntry;
        } catch (Exception $e) {
            DB::rollBack();
            throw $e;
        }
    }

    public function delete(User $user, int $id): bool
    {
        $cvEntry = $this->findById($user, $id);

        return $cvEntry->delete();
    }
}
