<?php

use Acms\Services\Facades\Common;
use Acms\Services\Facades\Media;
use Acms\Services\Facades\Session;

class ACMS_POST_Media_Upload extends ACMS_POST
{
    function post()
    {
        // 同一セッションの並列アップロードがセッションロック（GET_LOCK）で直列化されるのを防ぐ。
        // 二重送信チェックは fire() 内で完了済みのため、重い画像処理の前にセッションを閉じてよい。
        if (session_status() === PHP_SESSION_ACTIVE) {
            Session::handle()->writeClose();
        }

        $mid = 0;
        $data = [];

        try {
            if (!Media::validate()) {
                throw new \RuntimeException('メディア機能が有効でないか、権限がありません');
            }
            $tags = $this->Post->get('tags');
            $fileUploadValidator = App::make('validator.file-upload');
            assert($fileUploadValidator instanceof \Acms\Services\Validator\FileUploadValidator);
            $fileUploadValidator->validateFileUpload('file');

            $validation = Media::validateFileName($_FILES['file']['name']);
            if (!$validation['valid']) {
                throw new \RuntimeException($validation['error']);
            }

            $info = Media::getBaseInfo($_FILES['file'], $tags);
            $type = mime_content_type($_FILES['file']['tmp_name']);
            $type = $type !== false ? $type : '';
            if (!Media::isUploadableImageFormat($type)) {
                throw new \RuntimeException('この画像形式はアップロードできません。この環境ではサポートされていません。');
            }
            if (Media::isImageFile($type)) {
                $data = Media::uploadImage('file');
            } elseif (Media::isSvgFile($type)) {
                $data = Media::uploadSvg('file');
            } else {
                $data = Media::uploadFile('file');
            }
            if (empty($data)) {
                throw new \RuntimeException('Upload failed.');
            }
            $mid = DB::query(SQL::nextval('media_id', dsn()), 'seq');

            if (isset($_FILES['media_pdf_thumbnail'])) {
                $res = Media::uploadPdfThumbnail('media_pdf_thumbnail');
                $data['thumbnail'] = $res['path'];
                $data['size'] = $res['size'];
                $data['field_6'] = 1;
            }
            Media::insertMedia($mid, $data, BID);
            Media::saveTags($mid, $tags, BID);

            $data = Media::getMedia($mid);
            if ($data === null) {
                throw new \RuntimeException(sprintf(
                    'Could not reload media information after saving. (Media ID: %d)',
                    $mid
                ));
            }
            $tags = Media::getMediaLabel($mid);
            $json = Media::buildJson($mid, $data, $tags, BID);
            $json['status'] = 'success';

            if (HOOK_ENABLE) {
                $Hook = ACMS_Hook::singleton();
                $Hook->call('saveMedia', [$mid, 'insert', true]);
            }

            AcmsLogger::info('メディアをアップロードしました', [
                'mid' => $mid,
                'data' => $data,
            ]);

            Response::json($json);
        } catch (\Exception $e) {
            AcmsLogger::notice('メディアのアップロードに失敗しました。' . $e->getMessage(), Common::exceptionArray($e, ['mid' => $mid, 'data' => $data]));

            Response::json([
                'status' => 'failure',
                'message' => $e->getMessage(),
            ]);
        }
    }
}
