<?php
/**
 * Kontroler Notatki - przechowywanie notatek użytkowników
 */

require_once __DIR__ . '/BaseController.php';

class NotesController extends BaseController
{
    private User $userModel;
    private Database $db;

    public function __construct()
    {
        parent::__construct();
        $this->userModel = new User();
        $this->db = Database::getInstance();
        
        // Upewnij się że tabela istnieje (dla istniejących instalacji)
        $this->ensureNotesTable();
    }

    /**
     * Strona główna - notatki użytkownika lub lista użytkowników dla admina
     */
    public function index(): void
    {
        $userId = $this->currentUser['id'];
        $viewUserId = null;
        $viewUser = null;
        
        // Admin może przeglądać notatki innych użytkowników
        if ($this->auth->isAdmin() && get('user_id')) {
            $viewUserId = (int)get('user_id');
            $viewUser = $this->userModel->getById($viewUserId);
            
            if (!$viewUser) {
                $this->redirect('notes', 'danger', 'Użytkownik nie istnieje.');
                return;
            }
        }
        
        $targetUserId = $viewUserId ?: $userId;
        $notes = $this->getNotes($targetUserId);
        
        $users = [];
        if ($this->auth->isAdmin()) {
            $users = $this->userModel->getAll(1000);
        }

        $this->render('notes/index.tpl', [
            'pageTitle' => 'Notatki',
            'notes' => $notes,
            'users' => $users,
            'viewUser' => $viewUser,
            'viewUserId' => $viewUserId
        ]);
    }

    /**
     * Zapisz notatki
     */
    public function save(): void
    {
        if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
            $this->redirect('notes');
            return;
        }

        if (!$this->verifyCsrf()) {
            return;
        }

        $content = post('content', '');
        $targetUserId = (int)post('user_id', $this->currentUser['id']);
        
        // Sprawdź uprawnienia
        if ($targetUserId !== $this->currentUser['id'] && !$this->auth->isAdmin()) {
            if (isAjax()) {
                $this->json(['success' => false, 'error' => 'Brak uprawnień.']);
            } else {
                $this->redirect('notes', 'danger', 'Brak uprawnień.');
            }
            return;
        }

        // Zapisz notatki
        $this->saveNotes($targetUserId, $content);

        // Loguj tylko dla admina edytującego cudze notatki
        if ($targetUserId !== $this->currentUser['id']) {
            $user = $this->userModel->getById($targetUserId);
            $this->logger->log(
                'notes_updated',
                "Zaktualizowano notatki użytkownika: {$user['username']}",
                $this->currentUser['id']
            );
        }

        if (isAjax()) {
            $this->json(['success' => true, 'message' => 'Notatki zostały zapisane.']);
        } else {
            $redirectUrl = 'notes';
            if ($targetUserId !== $this->currentUser['id']) {
                $redirectUrl .= '?user_id=' . $targetUserId;
            }
            $this->redirect($redirectUrl, 'success', 'Notatki zostały zapisane.');
        }
    }

    /**
     * Pobierz notatki użytkownika
     */
    private function getNotes(int $userId): string
    {
        $row = $this->db->fetchOne(
            "SELECT content FROM notes WHERE user_id = :user_id",
            ['user_id' => $userId]
        );
        
        return $row ? $row['content'] : '';
    }

    /**
     * Zapisz notatki użytkownika
     */
    private function saveNotes(int $userId, string $content): void
    {
        $existing = $this->db->fetchOne(
            "SELECT id FROM notes WHERE user_id = :user_id",
            ['user_id' => $userId]
        );

        if ($existing) {
            $this->db->execute(
                "UPDATE notes SET content = :content, updated_at = datetime('now') WHERE user_id = :user_id",
                ['content' => $content, 'user_id' => $userId]
            );
        } else {
            $this->db->insert(
                "INSERT INTO notes (user_id, content) VALUES (:user_id, :content)",
                ['user_id' => $userId, 'content' => $content]
            );
        }
    }

    /**
     * Upewnij się że tabela notes istnieje (dla istniejących instalacji)
     */
    private function ensureNotesTable(): void
    {
        $this->db->execute("
            CREATE TABLE IF NOT EXISTS notes (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                user_id INTEGER NOT NULL UNIQUE,
                content TEXT DEFAULT '',
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
            )
        ");
    }
}
