<?php

namespace App\Models;

use CodeIgniter\Model;

class ConfigurationModel extends Model
{
    protected $table = 'configuration'; // The name of the table
    protected $primaryKey = 'id';       // The primary key of the table

    protected $allowedFields = [
        'config_key', 
        'config_value',
    ]; 

    /**
     * Get configuration value by key.
     *
     * @param string $key
     * @return string|null
     */
    public function getConfigValueByKey(string $key)
    {
        // Use a fresh builder to avoid stale state from shared model builder.
        $builder = $this->db->table($this->table);
        $result = $builder->where('config_key', $key)
            ->orderBy('id', 'DESC')
            ->get(1)
            ->getRowArray();
        return $result['config_value'] ?? null;
    }

    /**
     * Set configuration value by key.
     *
     * @param string $key
     * @param string $value
     * @return bool
     */
    public function setConfigValueByKey(string $key, string $value): bool
    {
        // If one or more rows exist for this key, update ALL of them to avoid
        // inconsistent reads when duplicates are present.
        $count = $this->where('config_key', $key)->countAllResults();

        if ($count > 0) {
            // Use a direct builder update scoped by key to affect all matches
            $ok = (bool) $this->db->table($this->table)
                ->where('config_key', $key)
                ->update(['config_value' => $value]);
            return $ok;
        }

        // Insert a new record if none exist
        return $this->insert(['config_key' => $key, 'config_value' => $value]) !== false;
    }

    // Method to retrieve all configuration data
    public function getAllConfigs()
    {
        return $this->findAll();
    }

    // Method to update configuration by key
    public function updateConfig($id, $data)
    {
        return $this->update($id, $data);
    }

    // Method to add new configuration
    public function addConfig($data)
    {
        return $this->insert($data);
    }

    public function getConfig($key)
    {
        $key = (string) $key;
        if ($key === 'school_year') {
            $activeSchoolYear = $this->activeSchoolYearName();
            if ($activeSchoolYear !== null) {
                return $activeSchoolYear;
            }
        }

        if ($key === 'semester') {
            try {
                $semester = (new \App\Services\SemesterRangeService($this))->getSemesterForDate();
                if ($semester !== '') {
                    return $semester;
                }
            } catch (\Throwable $e) {
                // ignore and fall back
            }
        }

        return $this->getConfigValueByKey($key);
    }

    private function activeSchoolYearName(): ?string
    {
        try {
            if (! $this->db->tableExists('school_years')) {
                return null;
            }

            $row = $this->db->table('school_years')
                ->select('name')
                ->where('status', 'active')
                ->orderBy('id', 'DESC')
                ->get(1)
                ->getRowArray();

            $name = trim((string) ($row['name'] ?? ''));

            return $name !== '' ? $name : null;
        } catch (\Throwable) {
            return null;
        }
    }
}
