--[[
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
]]--

-- This is mbox.lua - a script for generating mbox archives

local JSON = require 'cjson'
local elastic = require 'lib/elastic'
local aaa = require 'lib/aaa'
local user = require 'lib/user'
local cross = require 'lib/cross'

local days = {
    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 30, 31 
}

function leapYear(year)
    if (year % 4 == 0) then
        if (year%100 == 0)then                
            if (year %400 == 0) then                    
                return true
            end
        else                
            return true
        end
        return false
    end
end

function handle(r)
    r.content_type = "text/plain"
    local get = r:parseargs()
    if get.list and get.date then
        local lid = ("<%s>"):format(get.list:gsub("@", "."):gsub("[<>]", ""))
        local month = get.date:match("(%d+%-%d+)")
        if not month then
            r:puts("Wrong date format given!\n")
            return cross.OK
        end
        local y, m = month:match("(%d+)%-(%d+)")
        m = tonumber(m)
        y = tonumber(y)
        if m == 2 and leapYear(y) then
            d = 29
        else
            d = days[m]
        end
        
        -- fetch all results from the list (up to 20k results), make sure to get the 'private' element
        local docs = elastic.raw {
            _source = {'mid','private'},
            query = {
                
                bool = {
                    must = {
                        
                        {
                            range = {
                                date = {
                                    gte = ("%04d/%02d/%02d 00:00:00"):format(y,m,1),
                                    lte = ("%04d/%02d/%02d 00:00:00"):format(y,m,d)
                                }
                            }
                        },
                        {
                        term = {
                            list_raw = lid
                        }
                    }
                        
                }}
                
            },
            sort = {
            {
                epoch = {
                    order = "asc"
                }
            }  
        },
        size = 20000
        }
        
        local mfile = ""
        -- for each email, get the actual source of it to plop into the mbox file
        for k, v in pairs(docs.hits.hits) do
            v = v._source
            if not v.private then
                local doc = elastic.get('mbox_source', v.mid)
                if doc and doc.source then
                    r:puts("From \n")
                    r:puts(doc.source)
                    r:puts("\n")
                end
            end
        end
    end
    return cross.OK
end

cross.start(handle)
