<?php

require_once APP_ROOT . '/models/Subcollection.php';
require_once APP_ROOT . '/models/Collection.php';
require_once APP_ROOT . '/models/Item.php';
require_once APP_ROOT . '/models/ItemVariant.php';
require_once APP_ROOT . '/models/ItemImage.php';

class SubcollectionController
{
    private Subcollection $subModel;

    public function __construct()
    {
        if (!Session::isLoggedIn()) {
            header('Location: ' . APP_URL . '/login');
            exit;
        }
        $this->subModel = new Subcollection();
    }

    public function create(string $collection_id): void
    {
        $collectionModel = new Collection();
        $collection = $collectionModel->findById((int)$collection_id);
        if (!$collection) {
            header('Location: ' . APP_URL . '/home');
            exit;
        }
        require APP_ROOT . '/views/subcollections/create.php';
    }

    public function store(): void
    {
        if (!Session::verifyCsrfToken($_POST['csrf_token'] ?? '')) {
            Session::flash('error', 'Invalid request.');
            header('Location: ' . APP_URL . '/home');
            exit;
        }

        $collectionId = (int)($_POST['collection_id'] ?? 0);
        $name = trim($_POST['name'] ?? '');
        $description = trim($_POST['description'] ?? '');

        $validator = new Validator();
        $validator->required('name', $name, Lang::get('subcollection_name'));

        if ($validator->fails()) {
            Session::flash('error', $validator->firstError());
            header('Location: ' . APP_URL . '/collections/' . $collectionId . '/subcollections/create');
            exit;
        }

        $this->subModel->create([
            'collection_id' => $collectionId,
            'name'          => $name,
            'description'   => $description,
        ]);

        Session::flash('success', Lang::get('subcollection_created'));
        header('Location: ' . APP_URL . '/collections/' . $collectionId);
        exit;
    }

    public function show(string $id): void
    {
        $subcollection = $this->subModel->getWithCollection((int)$id);
        if (!$subcollection) {
            header('Location: ' . APP_URL . '/home');
            exit;
        }

        $items = [];
        $itemVariants = [];
        $itemImages = [];
        
        if ($subcollection['type'] === 'coin') {
            // Handle coins
            require_once APP_ROOT . '/models/Coin.php';
            require_once APP_ROOT . '/models/CoinImage.php';
            require_once APP_ROOT . '/models/CoinVariant.php';
            
            $coinModel = new Coin();
            $coinImageModel = new CoinImage();
            $coinVariantModel = new CoinVariant();
            $items = $coinModel->getAllBySubcollection((int)$id);
            foreach ($items as $coin) {
                $itemVariants[$coin['id']] = $coinVariantModel->getAllByCoin($coin['id']);
                $itemImages[$coin['id']] = $coinImageModel->getAllByCoin($coin['id']);
            }
        } else {
            // Handle banknotes (existing code)
            $itemModel = new Item();
            $variantModel = new ItemVariant();
            $imageModel = new ItemImage();
            $items = $itemModel->getAllBySubcollection((int)$id);
            foreach ($items as $item) {
                $itemVariants[$item['id']] = $variantModel->getAllByItem($item['id']);
                $itemImages[$item['id']] = $imageModel->getAllByItem($item['id']);
            }
        }

        $view = $_GET['view'] ?? (Session::get('default_view', 'grid'));

        require APP_ROOT . '/views/subcollections/show.php';
    }

    public function edit(string $id): void
    {
        $subcollection = $this->subModel->getWithCollection((int)$id);
        if (!$subcollection) {
            header('Location: ' . APP_URL . '/home');
            exit;
        }
        require APP_ROOT . '/views/subcollections/edit.php';
    }

    public function update(string $id): void
    {
        if (!Session::verifyCsrfToken($_POST['csrf_token'] ?? '')) {
            Session::flash('error', 'Invalid request.');
            header('Location: ' . APP_URL . '/subcollections/' . $id . '/edit');
            exit;
        }

        $name = trim($_POST['name'] ?? '');
        $description = trim($_POST['description'] ?? '');

        $validator = new Validator();
        $validator->required('name', $name, Lang::get('subcollection_name'));

        if ($validator->fails()) {
            Session::flash('error', $validator->firstError());
            header('Location: ' . APP_URL . '/subcollections/' . $id . '/edit');
            exit;
        }

        $this->subModel->update((int)$id, [
            'name'        => $name,
            'description' => $description,
        ]);

        Session::flash('success', Lang::get('subcollection_updated'));
        header('Location: ' . APP_URL . '/subcollections/' . $id);
        exit;
    }

    public function delete(string $id): void
    {
        $sub = $this->subModel->getWithCollection((int)$id);
        $collectionId = $sub ? $sub['collection_id'] : null;

        $this->subModel->delete((int)$id);
        Session::flash('success', Lang::get('subcollection_deleted'));

        $redirect = $collectionId ? APP_URL . '/collections/' . $collectionId : APP_URL . '/home';
        header('Location: ' . $redirect);
        exit;
    }

    public function moveUp(string $id): void
    {
        $sub = $this->subModel->getWithCollection((int)$id);
        if (!$sub) { header('Location: ' . APP_URL . '/home'); exit; }

        $all = $this->subModel->getAllByCollection($sub['collection_id']);
        foreach ($all as $i => $s) {
            if ($s['id'] == (int)$id && $i > 0) {
                $this->subModel->swap((int)$id, $all[$i - 1]['id'], $sub['collection_id']);
                break;
            }
        }
        header('Location: ' . APP_URL . '/collections/' . $sub['collection_id']);
        exit;
    }

    public function moveDown(string $id): void
    {
        $sub = $this->subModel->getWithCollection((int)$id);
        if (!$sub) { header('Location: ' . APP_URL . '/home'); exit; }

        $all = $this->subModel->getAllByCollection($sub['collection_id']);
        $count = count($all);
        foreach ($all as $i => $s) {
            if ($s['id'] == (int)$id && $i < $count - 1) {
                $this->subModel->swap((int)$id, $all[$i + 1]['id'], $sub['collection_id']);
                break;
            }
        }
        header('Location: ' . APP_URL . '/collections/' . $sub['collection_id']);
        exit;
    }
}
