<?php

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

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

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

require_once BASE_PATH . '/app/helpers/MapEmbed.php';


class OwnerSettingController
    extends OwnerBaseController
{
    private ShopSetting $settingModel;

    private SocialLink $socialModel;


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


        $this->settingModel =
            new ShopSetting();


        $this->socialModel =
            new SocialLink();
    }


    // ========================================================
    // PAGE
    // ========================================================

    public function index(): void
    {
        $settings =
            $this->settingModel
                ->get();


        $socialLinks =
            $this->socialModel
                ->getAll();


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


    // ========================================================
    // UPDATE SHOP
    // ========================================================

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

        $this->validateCsrf();


        $shopName =
            trim(
                $_POST['shop_name']
                ?? ''
            );


        if ($shopName === '') {

            $this->flashError(
                'Tên cửa hàng không được để trống.'
            );

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


        $phone =
            trim(
                $_POST['phone']
                ?? ''
            );


        $email =
            strtolower(
                trim(
                    $_POST['email']
                    ?? ''
                )
            );


        if (
            $email !== ''
            && !filter_var(
                $email,
                FILTER_VALIDATE_EMAIL
            )
        ) {

            $this->flashError(
                'Email cửa hàng không hợp lệ.'
            );

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


        $mapEmbedUrl =
            trim(
                $_POST['map_embed_url']
                ?? ''
            );


        if (
            $mapEmbedUrl !== ''
            && !is_valid_google_map_embed_url($mapEmbedUrl)
        ) {

            $this->flashError(
                'Chỉ chấp nhận URL Google Maps dạng Embed (https://www.google.com/maps/embed?...).'
            );

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


        // ====================================================
        // UPDATE DATABASE
        // ====================================================

        $this->settingModel
            ->updateSpaDetails([
                'shop_name' =>
                    $shopName,

                'phone' =>
                    $phone,

                'email' =>
                    $email,

                'address' =>
                    trim(
                        $_POST['address']
                        ?? ''
                    ),

                'description' =>
                    trim(
                        $_POST['description']
                        ?? ''
                    ),

                'map_embed_url' => $mapEmbedUrl
            ]);


        // ====================================================
        // LOGO
        // ====================================================

        try {

            if (
                isset(
                    $_POST['remove_logo']
                )
            ) {

                $this->removeLogo();

            } elseif (
                !empty(
                    $_FILES['logo']
                )

                && $_FILES['logo']['error']
                    !== UPLOAD_ERR_NO_FILE
            ) {

                $this->replaceLogo();
            }


        } catch (RuntimeException $e) {

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

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


        $this->flashSuccess(
            'Đã cập nhật thông tin cửa hàng.'
        );


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


    // ========================================================
    // SAVE SOCIAL
    // ========================================================

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

        $this->validateCsrf();


        $platform =
            strtolower(
                trim(
                    $_POST['platform']
                    ?? ''
                )
            );


        $allowedPlatforms = [
            'facebook',
            'tiktok',
            'zalo',
            'instagram',
            'youtube'
        ];


        if (
            !in_array(
                $platform,
                $allowedPlatforms,
                true
            )
        ) {

            $this->flashError(
                'Nền tảng mạng xã hội không hợp lệ.'
            );

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


        /*
|--------------------------------------------------------------------------
| XỬ LÝ ĐƯỜNG DẪN MẠNG XÃ HỘI
|--------------------------------------------------------------------------
*/

$url =
    trim(
        $_POST['url']
        ?? ''
    );


/*
|--------------------------------------------------------------------------
| ZALO
|--------------------------------------------------------------------------
*/

if ($platform === 'zalo') {

    $zaloType =
        strtolower(
            trim(
                $_POST['zalo_type']
                ?? 'phone'
            )
        );


    /*
    |----------------------------------------------------------------------
    | Zalo bằng số điện thoại
    |----------------------------------------------------------------------
    */

    if ($zaloType === 'phone') {

        /*
         * Chỉ giữ số.
         */
        $phone =
            preg_replace(
                '/\D+/',
                '',
                $url
            );


        /*
         * Nếu người dùng nhập +84
         *
         * Ví dụ:
         * +84909090909
         *
         * sau khi preg_replace:
         * 84909090909
         *
         * chuyển thành:
         * 0909090909
         */
        if (
            str_starts_with(
                $phone,
                '84'
            )
        ) {

            $phone =
                '0'
                . substr(
                    $phone,
                    2
                );
        }


        /*
         * Validate số điện thoại VN cơ bản.
         */
        if (
            !preg_match(
                '/^0[0-9]{9}$/',
                $phone
            )
        ) {

            $this->flashError(
                'Số điện thoại Zalo không hợp lệ.'
            );

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


        /*
         * Chuyển thành link Zalo.
         */
        $url =
            'https://zalo.me/'
            . $phone;

    }


    /*
    |----------------------------------------------------------------------
    | Zalo Official Account
    |----------------------------------------------------------------------
    */

    elseif ($zaloType === 'oa') {

        if (
            !filter_var(
                $url,
                FILTER_VALIDATE_URL
            )
            ||
            !preg_match(
                '#^https://zalo\.me/#i',
                $url
            )
        ) {

            $this->flashError(
                'Đường dẫn Zalo OA không hợp lệ. Vui lòng sử dụng dạng https://zalo.me/...'
            );

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

    }


    /*
    |----------------------------------------------------------------------
    | Kiểu không hợp lệ
    |----------------------------------------------------------------------
    */

    else {

        $this->flashError(
            'Kiểu liên kết Zalo không hợp lệ.'
        );

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

}


/*
|--------------------------------------------------------------------------
| FACEBOOK / TIKTOK / INSTAGRAM / YOUTUBE
|--------------------------------------------------------------------------
*/

else {

    if (
        !filter_var(
            $url,
            FILTER_VALIDATE_URL
        )
    ) {

        $this->flashError(
            'Đường dẫn mạng xã hội không hợp lệ.'
        );

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

}


        $this->socialModel
            ->save([
                'platform' =>
                    $platform,

                'url' =>
                    $url,

                'sort_order' =>
                    (int)
                    ($_POST[
                        'sort_order'
                    ] ?? 0),

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


        $this->flashSuccess(
            'Đã lưu liên kết mạng xã hội.'
        );


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


    // ========================================================
    // TOGGLE SOCIAL
    // ========================================================

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

        $this->validateCsrf();


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


        $this->socialModel
            ->toggle($id);


        $this->flashSuccess(
            'Đã cập nhật mạng xã hội.'
        );


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


    // ========================================================
    // DELETE SOCIAL
    // ========================================================

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

        $this->validateCsrf();


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


        $this->socialModel
            ->delete($id);


        $this->flashSuccess(
            'Đã xóa liên kết mạng xã hội.'
        );


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


    // ========================================================
    // REPLACE LOGO
    // ========================================================

    private function replaceLogo(): void
    {
        $file =
            $_FILES['logo'];


        if (
            $file['error']
            !== UPLOAD_ERR_OK
        ) {

            throw new RuntimeException(
                'Upload logo thất bại.'
            );
        }


        if (
            $file['size']
            > 3 * 1024 * 1024
        ) {

            throw new RuntimeException(
                'Logo tối đa 3MB.'
            );
        }


        $finfo =
            new finfo(
                FILEINFO_MIME_TYPE
            );


        $mime =
            $finfo->file(
                $file['tmp_name']
            );


        $allowed = [
            'image/jpeg' =>
                'jpg',

            'image/png' =>
                'png',

            'image/webp' =>
                'webp'
        ];


        if (
            !isset(
                $allowed[$mime]
            )
        ) {

            throw new RuntimeException(
                'Logo chỉ hỗ trợ JPG, PNG hoặc WEBP.'
            );
        }


        $directory =
            BASE_PATH
            . '/public/uploads/shop/';


        if (
            !is_dir(
                $directory
            )
        ) {

            mkdir(
                $directory,
                0755,
                true
            );
        }


        $filename =
            'logo_'
            . bin2hex(
                random_bytes(10)
            )
            . '.'
            . $allowed[$mime];


        if (
            !move_uploaded_file(
                $file['tmp_name'],
                $directory . $filename
            )
        ) {

            throw new RuntimeException(
                'Không thể lưu logo.'
            );
        }


        $settings =
            $this->settingModel
                ->get();


        $oldLogo =
            $settings['logo']
            ?? null;


        $newLogo =
            'uploads/shop/'
            . $filename;


        $this->settingModel
            ->updateLogo(
                $newLogo
            );


        if ($oldLogo) {

            $oldFile =
                BASE_PATH
                . '/public/'
                . ltrim(
                    $oldLogo,
                    '/'
                );


            if (
                is_file(
                    $oldFile
                )
            ) {

                @unlink($oldFile);
            }
        }
    }


    // ========================================================
    // REMOVE LOGO
    // ========================================================

    private function removeLogo(): void
    {
        $settings =
            $this->settingModel
                ->get();


        if (
            !empty(
                $settings['logo']
            )
        ) {

            $file =
                BASE_PATH
                . '/public/'
                . ltrim(
                    $settings['logo'],
                    '/'
                );


            if (is_file($file)) {
                @unlink($file);
            }
        }


        $this->settingModel
            ->updateLogo(null);
    }
}
