<?php

require_once BASE_PATH
    . '/app/controllers/owner/OwnerBaseController.php';

require_once BASE_PATH
    . '/app/models/Promotion.php';


class OwnerPromotionController
    extends OwnerBaseController
{
    private Promotion $promotionModel;


    public function __construct()
    {
        $this->requireOwner();

        $this->promotionModel =
            new Promotion();
    }


    public function index(): void
    {
        $search =
            trim(
                $_GET['search']
                ?? ''
            );


        $page =
            max(
                1,
                (int)
                ($_GET['page'] ?? 1)
            );


        $perPage = 15;


        $totalPromotions =
            $this->promotionModel
                ->countForOwner(
                    $search
                );


        $totalPages =
            max(
                1,
                (int)
                ceil(
                    $totalPromotions
                    / $perPage
                )
            );


        $page =
            min(
                $page,
                $totalPages
            );


        $promotions =
            $this->promotionModel
                ->getForOwner(
                    $search,
                    $perPage,
                    ($page - 1)
                    * $perPage
                );


        require BASE_PATH
            . '/app/views/owner/promotions/index.php';
    }


    public function create(): void
    {
        require BASE_PATH
            . '/app/views/owner/promotions/create.php';
    }


    public function store(): void
    {
        $this->requirePost();

        $this->validateCsrf();


        try {

            $data =
                $this->validatePromotion();


            if (
                $this->promotionModel
                    ->codeExists(
                        $data['code']
                    )
            ) {

                throw new RuntimeException(
                    'Mã khuyến mãi đã tồn tại.'
                );
            }


            $promotionId =
                $this->promotionModel
                    ->create($data);


            $this->flashSuccess(
                'Đã tạo mã khuyến mãi.'
            );


            header(
                'Location: '
                . BASE_URL
                . '/?url=owner/promotion/edit&id='
                . $promotionId
            );

            exit;


        } catch (RuntimeException $e) {

            $this->flashError(
                $e->getMessage()
            );


            $this->redirect(
                'owner/promotion/create'
            );
        }
    }


    public function edit(): void
    {
        $id =
            (int)
            ($_GET['id'] ?? 0);


        $promotion =
            $this->promotionModel
                ->findById($id);


        if (!$promotion) {

            http_response_code(404);

            require BASE_PATH
                . '/app/views/errors/404.php';

            return;
        }


        require BASE_PATH
            . '/app/views/owner/promotions/edit.php';
    }


    public function update(): void
    {
        $this->requirePost();

        $this->validateCsrf();


        $id =
            (int)
            ($_POST['promotion_id']
                ?? 0);


        $promotion =
            $this->promotionModel
                ->findById($id);


        if (!$promotion) {

            $this->flashError(
                'Mã khuyến mãi không tồn tại.'
            );

            $this->redirect(
                'owner/promotions'
            );
        }


        try {

            $data =
                $this->validatePromotion();


            if (
                $this->promotionModel
                    ->codeExists(
                        $data['code'],
                        $id
                    )
            ) {

                throw new RuntimeException(
                    'Mã khuyến mãi đã tồn tại.'
                );
            }


            if (
                $data['usage_limit']
                !== null

                && $data['usage_limit']
                    < (int)
                    $promotion['used_count']
            ) {

                throw new RuntimeException(
                    'Giới hạn lượt dùng không thể nhỏ hơn số lượt đã sử dụng.'
                );
            }


            $this->promotionModel
                ->updatePromotion(
                    $id,
                    $data
                );


            $this->flashSuccess(
                'Đã cập nhật khuyến mãi.'
            );


        } catch (RuntimeException $e) {

            $this->flashError(
                $e->getMessage()
            );
        }


        header(
            'Location: '
            . BASE_URL
            . '/?url=owner/promotion/edit&id='
            . $id
        );

        exit;
    }


    public function toggle(): void
    {
        $this->requirePost();

        $this->validateCsrf();


        $id =
            (int)
            ($_POST['promotion_id']
                ?? 0);


        $promotion =
            $this->promotionModel
                ->findById($id);


        if (!$promotion) {

            $this->flashError(
                'Khuyến mãi không tồn tại.'
            );

        } else {

            $this->promotionModel
                ->toggleActive($id);


            $this->flashSuccess(
                'Đã cập nhật trạng thái khuyến mãi.'
            );
        }


        $this->redirect(
            'owner/promotions'
        );
    }


    private function validatePromotion(): array
    {
        $name =
    trim(
        $_POST['name']
        ?? ''
    );

if ($name === '') {
    throw new RuntimeException(
        'Tên chương trình khuyến mãi không được để trống.'
    );
}

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


        if (
            !preg_match(
                '/^[A-Z0-9_-]{3,30}$/',
                $code
            )
        ) {

            throw new RuntimeException(
                'Mã khuyến mãi chỉ dùng chữ in hoa, số, dấu - hoặc _, từ 3 đến 30 ký tự.'
            );
        }


        $discountType =
            $_POST['discount_type']
            ?? 'percent';


        if (
            !in_array(
                $discountType,
                [
                    'percent',
                    'fixed'
                ],
                true
            )
        ) {

            throw new RuntimeException(
                'Loại giảm giá không hợp lệ.'
            );
        }


        $discountValue =
            (float)
            ($_POST['discount_value']
                ?? 0);


        if ($discountValue <= 0) {

            throw new RuntimeException(
                'Giá trị giảm phải lớn hơn 0.'
            );
        }


        if (
            $discountType === 'percent'
            && $discountValue > 100
        ) {

            throw new RuntimeException(
                'Giảm theo phần trăm không được vượt quá 100%.'
            );
        }


        $minOrderValue =
            max(
                0,
                (float)
                ($_POST['min_order_value']
                    ?? 0)
            );


        $maxDiscountRaw =
            trim(
                $_POST['max_discount']
                ?? ''
            );


        $maxDiscount =
            $maxDiscountRaw === ''
                ? null
                : max(
                    0,
                    (float)
                    $maxDiscountRaw
                );


        $usageLimitRaw =
            trim(
                $_POST['usage_limit']
                ?? ''
            );


        $usageLimit =
            $usageLimitRaw === ''
                ? null
                : max(
                    1,
                    (int)
                    $usageLimitRaw
                );


        $startRaw =
            trim(
                $_POST['start_at']
                ?? ''
            );


        $endRaw =
            trim(
                $_POST['end_at']
                ?? ''
            );


        if (
            $startRaw === ''
            || $endRaw === ''
        ) {

            throw new RuntimeException(
                'Vui lòng chọn thời gian bắt đầu và kết thúc.'
            );
        }


        try {

            $start =
                new DateTime(
                    $startRaw
                );


            $end =
                new DateTime(
                    $endRaw
                );

        } catch (Throwable $e) {

            throw new RuntimeException(
                'Thời gian khuyến mãi không hợp lệ.'
            );
        }


        if ($end <= $start) {

            throw new RuntimeException(
                'Thời gian kết thúc phải sau thời gian bắt đầu.'
            );
        }


        return [

            'code' =>
                $code,

            'discount_type' =>
                $discountType,

            'discount_value' =>
                $discountValue,

            'min_order_value' =>
                $minOrderValue,

            'max_discount' =>
                $maxDiscount,

            'start_at' =>
                $start->format(
                    'Y-m-d H:i:s'
                ),

            'end_at' =>
                $end->format(
                    'Y-m-d H:i:s'
                ),

            'usage_limit' =>
                $usageLimit,

            'is_active' =>
                isset(
                    $_POST['is_active']
                )
                    ? 1
                    : 0,
            'name' => $name,
'description' => $description,  
                
        ];
    }
}