<?php

namespace App\Traits;

use App\Http\Resources\UserResource;
use Carbon\Carbon;

trait CustomDataResource
{
    public function getCustomData($schema): array
    {
        $formatted_data = [];

        foreach ($schema as $column => $data) {
            if (!$data['system_default']){
                switch ($data['type']) {
                    case 'enum':
                        $selected_answers = $this->custom_data[$column] ?? [];
                        foreach ($selected_answers as $answer) {
                            $formatted_data[$column][$answer] = $data['options']['answers'][$answer];
                        }
                        if (empty($selected_answers)) {
                            $formatted_data[$column] = null;
                        }
                        break;
                    case 'enum_single':
                        $answer = $this->custom_data[$column] ?? null;
                        if ($answer) {
                            $formatted_data[$column][$answer] = $data['options']['answers'][$answer];
                        } else {
                            $formatted_data[$column] = null;
                        }
                        break;
                    case 'foreign_key':
                        $formatted_data[$data['options']['relationship_column']] = $this->custom_data[$data['options']['relationship_column']] ?? null;
                        break;
                    default:
                        $formatted_data[$column] = $this->custom_data[$column] ?? null;
                        break;
                }
            }
        }


        $formatted_data['created_at'] = Carbon::parse($this->created_at)->format('Y-m-d H:i:s');
        $formatted_data['updated_at'] = Carbon::parse($this->updated_at)->format('Y-m-d H:i:s');
        $formatted_data['created_by'] = new UserResource($this->whenLoaded('createdBy'));
        $formatted_data['last_updated_by'] = new UserResource($this->whenLoaded('lastUpdatedBy'));

        return $formatted_data;
    }



    public function getAllData($schema): array
    {
        $formatted_data = [];

        foreach ($schema as $column => $data) {
            if (!$data['system_default']){
                switch ($data['type']) {
                    case 'enum':
                        $selected_answers = $this->custom_data[$column] ?? [];
                        foreach ($selected_answers as $answer) {
                            $formatted_data[$column][$answer] = $data['options']['answers'][$answer];
                        }
                        if (empty($selected_answers)) {
                            $formatted_data[$column] = null;
                        }
                        break;
                    case 'enum_single':
                        $answer = $this->custom_data[$column] ?? null;
                        if ($answer) {
                            $formatted_data[$column][$answer] = $data['options']['answers'][$answer];
                        } else {
                            $formatted_data[$column] = null;
                        }
                        break;
                    case 'foreign_key':
                        $formatted_data[$data['options']['relationship_column']] = $this->custom_data[$data['options']['relationship_column']] ?? null;
                        break;
                    default:
                        $formatted_data[$column] = $this->custom_data[$column] ?? null;
                        break;
                }
            }

            else{
                switch ($data['type']) {
                    case 'date':
                        $formatted_data[$column] = Carbon::parse($this->{$column})->format('Y-m-d');
                        break;
                    case 'time':
                        $formatted_data[$column] = Carbon::parse($this->{$column})->format('H:i:s');
                        break;
                    case 'datetime':
                        $formatted_data[$column] = Carbon::parse($this->{$column})->format('Y-m-d H:i:s');
                        break;
                    default:
                        $formatted_data[$column] = $this->{$column} ?? null;
                        break;
                }
            }
        }

        return $formatted_data;
    }
}
