local CameraShotHelper = {}

function CameraShotHelper:SaveShotImage(tBytes, szImageName)
    local szPath    = require("Base/Utils.lua"):TimeMonthFormat()

    local szFileDirectory = CS.UnityEngine.Application.dataPath .. "/" .. szPath
    if not CS.System.IO.Directory.Exists(szFileDirectory) then
        CS.System.IO.Directory.CreateDirectory(szFileDirectory)
    end

    local szFilePath = szFileDirectory .. "/" ..szImageName .. ".png"

    CS.System.IO.File.WriteAllBytes(szFilePath, tBytes)
end

local function GetShotImage(cameraObj, nWidth, nHeight)
    local cameraComponent     = cameraObj.transform:GetComponent("Camera")

    local renderTexture = CS.UnityEngine.RenderTexture(nWidth, nHeight, 0)
    cameraComponent.targetTexture = renderTexture
    cameraComponent:Render()

    CS.UnityEngine.RenderTexture.active = renderTexture
    local texture2D = CS.UnityEngine.Texture2D(nWidth, nHeight,
                        CS.UnityEngine.TextureFormat.ARGB32, false)
    local rect      = CS.UnityEngine.Rect(0, 0, nWidth, nHeight)

    texture2D:ReadPixels(rect, 0, 0)
    texture2D:Apply()

    cameraComponent.targetTexture = nil
    CS.UnityEngine.RenderTexture.active = nil
    CS.UnityEngine.GameObject.Destroy(renderTexture)

    return texture2D
end

function CameraShotHelper:CaptureCameraShot(cameraObj, nWidth, nHeight, szImageName)
    local texture2D = GetShotImage(cameraObj, nWidth, nHeight)
    local tBytes    = texture2D:EncodeToPNG()

    -- save image
    if szImageName then
        CameraShotHelper:SaveShotImage(tBytes, szImageName)
    end

    return texture2D
end

return CameraShotHelper