<?php

namespace App\Controllers\Specimen;

use App\Traits\PatchValidationTrait;
use App\Traits\ResponseTrait;
use App\Controllers\BaseController;
use App\Libraries\ValueSet;
use App\Models\Specimen\ContainerDefModel;

class ContainerDefController extends BaseController {
  use ResponseTrait;
  use PatchValidationTrait;

  protected $db;
  protected $model;
  protected $rules;
  protected $patchRules;

  public function __construct() {
    $this->db = \Config\Database::connect();
    $this->model = new ContainerDefModel();
    $this->rules = [
      'ConCode' => 'required|max_length[50]',
      'ConName' => 'required|max_length[50]'
    ];
    $this->patchRules = [
      'ConCode' => 'permit_empty|max_length[50]',
      'ConName' => 'permit_empty|max_length[50]'
    ];
  }

  public function index() {
    try {
			$filter = [
				'ConCode' => $this->request->getVar('ConCode'),
				'ConName' => $this->request->getVar('ConName')
			];
      $rows = $this->model->getContainers($filter);

      $rows = ValueSet::transformLabels($rows, [
        'ConCategory' => 'container_class',
        'CapColor' => 'container_cap_color',
        'ConSize' => 'container_size',
      ]);

      return $this->respond([ 'status' => 'success', 'message'=> "data fetched successfully", 'data'   => $rows ], 200);
    } catch (\Exception $e) {
      return $this->failServerError('Exception : '.$e->getMessage());
    }
  }

  public function show($ConDefID) {
    try {
      $row = $this->model->getContainer($ConDefID);
      if (empty($row)) {
        return $this->respond([ 'status' => 'success', 'message'=> "data not found", 'data' => null ], 200);
      }

      $row = ValueSet::transformLabels([$row], [
        'ConCategory' => 'container_class',
        'CapColor' => 'container_cap_color',
        'ConSize' => 'container_size',
      ])[0];

      return $this->respond([ 'status' => 'success', 'message'=> "data fetched successfully", 'data'   => $row ], 200);
    } catch (\Exception $e) {
      return $this->failServerError('Exception : '.$e->getMessage());
    }
  }

  public function create() {
    $input = $this->request->getJSON(true);
    if (!$this->validateData($input, $this->rules)) { return $this->failValidationErrors($this->validator->getErrors()); }
    try {
      $ConDefID = $this->model->insert($input);
      return $this->respondCreated([ 'status'  => 'success', 'message' => "data $ConDefID created successfully", 'data' => $ConDefID ]);
    } catch (\Exception $e) {
      return $this->failServerError('Something went wrong: ' . $e->getMessage());
    }
  }

  public function update($ConDefID = null) {
    $input = $this->requirePatchPayload($this->request->getJSON(true));
    if ($input === null) {
      return;
    }

    $id = $this->requirePatchId($ConDefID, 'ConDefID');
    if ($id === null) {
      return;
    }

    $existing = $this->model->find($id);
    if (!$existing) {
      return $this->respond([ 'status' => 'failed', 'message' => 'Container definition not found', 'data' => [] ], 404);
    }

    $validationInput = array_intersect_key($input, $this->patchRules);
    if (!empty($validationInput) && !$this->validateData($validationInput, $this->patchRules)) {
      return $this->failValidationErrors($this->validator->getErrors());
    }

    $input['ConDefID'] = $id;
    try {
      $this->model->update($id, $input);
      return $this->respondCreated([ 'status'  => 'success', 'message' => 'data updated successfully', 'data' => $id ], 201);
    } catch (\Exception $e) {
      return $this->failServerError('Something went wrong: ' . $e->getMessage());
    }
  }

}
