<?php

namespace App\Http\Controllers;

use App\Models\Claimcomment;
use App\Models\Missingcashbackclaims;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Yajny\Member\Models\UserClaim;
use Yajny\Member\Models\UserClaimComment;

class MissingcashbackclaimsController extends DataManangeCtrl
{
    protected $layout = "layouts.main";
    protected $data = array();
    public $module = 'missingcashbackclaims';
    static $per_page = '10';

    public function __construct()
    {
        $this->model = new Missingcashbackclaims();
        $this->modelview = new Claimcomment();
        parent::__construct();
    }

    function store(Request $request)
    {
        $id = 'NULL';
        if (isset($request->id) && !empty($request->id)) {
            $id = $request->id;
            $userClaim = UserClaim::findOrFail($request->id);
        } else {
            $userClaim = new UserClaim();
        }

        $validationRules = [
            'user_id' => "required|exists:users,user_id",
            'click_id' => "unique:user_claims,click_id,{$id},id|exists:clicks,id",
            'click_time' => 'date_format:Y-m-d H:i:s',
            'store_id' => "required|unique:user_claims,store_id,{$id},id,order_id,{$request->order_id}|exists:stores,id",
            'network_id' => "required|exists:networks,id",
            'currency_iso' => 'required',
            'platform' => 'required|in:website,mobile,ios,android',
            'transaction_date' => 'date_format:Y-m-d',
            'order_id' => "unique:user_claims,order_id,{$id},id,store_id,{$request->store_id}",
            'status' => 'required|in:open,hold,answered,closed',
            'attachments.*' => 'file|mimes:jpeg,bmp,png,gif,svg,jpg,webp|max:1000',
            'bulk_attachments.*.*' => 'file|mimes:jpeg,bmp,png,gif,svg,jpg,webp|max:1000'
        ];
        $request->validate($validationRules);

        $userClaim->user_id = $request->user_id;
        $userClaim->click_id = $request->click_id;
        $userClaim->click_time = $request->click_time;
        $userClaim->store_id = $request->store_id;
        $userClaim->network_id = $request->network_id;
        $userClaim->currency_iso = $request->currency_iso;
        $userClaim->platform = $request->platform;
        $userClaim->transaction_date = $request->transaction_date;
        $userClaim->order_id = $request->order_id;
        $userClaim->order_amount = $request->order_amount;
        $userClaim->message = $request->message;
        $userClaim->note = $request->note;
        $userClaim->status = $request->status;
        $userClaim->closed_by = $request->closed_by ?? null;
        $userClaim->save();

        $attachmentsUrls = [];
        $attachments = $request->attachments ?? [];
        foreach ($attachments as $attachment)
            $attachmentsUrls[] = Storage::disk('do-spaces')->putFile("claims/{$userClaim->id}", $attachment);

        if (!empty($attachmentsUrls)) {
            $userClaim->attachments = json_encode($attachmentsUrls);
            $userClaim->save();
        }

        $commentsData = $this->extractCommentsFromRequest($request);

        foreach ($commentsData['updateData'] as $comment_id => $updateRecord) {
            $comment = UserClaimComment::find($comment_id);
            $comment->comment = $updateRecord['comment'];
            if (isset($updateRecord['commented_by']))
                $comment->commented_by = $updateRecord['commented_by'];
            $comment->save();
        }

        foreach ($commentsData['insertData'] as $insertRecord) {
            $comment = new UserClaimComment();
            $comment->claim_id = $userClaim->id;
            $comment->comment = $insertRecord['comment'];
            $comment->commented_by = 'admin';
            $comment->save();

            $attachmentsUrls = [];
            $attachments = $insertRecord['attachments'] ?? [];
            foreach ($attachments as $attachment)
                $attachmentsUrls[] = Storage::disk('do-spaces')->putFile("claims/{$userClaim->id}", $attachment);

            if (!empty($attachmentsUrls)) {
                $comment->attachments = json_encode($attachmentsUrls);
                $comment->save();
            }
        }

        $deleteRecords = explode(',', $request->masterdetail_delete);
        UserClaimComment::whereIn('id', $deleteRecords)->delete();

        return redirect()->to('/manage/missingcashbackclaims');
    }

    private function extractCommentsFromRequest(Request $request)
    {
        $updateData = [];
        $insertData = [];
        $newCommentsKeys = array_keys($request->bulk_is_new ?? []);

        foreach ($request->bulk_comment ?? [] as $key => $comment)
            if (!in_array($key, $newCommentsKeys))
                $updateData[$key]['comment'] = $comment;
            else
                $insertData[$key]['comment'] = $comment;

        foreach ($request->bulk_commented_by ?? [] as $key => $commented_by)
            if (!in_array($key, $newCommentsKeys))
                $updateData[$key]['commented_by'] = $commented_by;
            else
                $insertData[$key]['commented_by'] = 'admin';

        foreach ($request->bulk_attachments ?? [] as $key => $attachments)
            $insertData[$key]['attachments'] = $attachments;

        return ['insertData' => $insertData, 'updateData' => $updateData];
    }
}
