function main()
    local fastmail = IMAP {
        server = 'imap.fastmail.com',
        username = 'maitysanchayan@fastmail.com',
        password = get_pwd_fastmail(),
        ssl = 'tls1',
    }

    fastmail.INBOX:check_status()
    mails = fastmail.INBOX:select_all()
    move_mailing_lists(fastmail, mails)
    mails = fastmail.Sent:select_all()
    move_mailing_lists(fastmail, mails)
    mails = fastmail['Trash']:select_all()
    delete_from_trash(fastmail, mails)
    mails = fastmail['Spam']:select_all()
    move_mailing_lists(fastmail, mails)

    local sanchayan = IMAP {
        server = 'imap.gmail.com',
        username = 'maitysanchayan@gmail.com',
        password = get_pwd_sanchayan(),
        ssl = 'tls1',
    }

    sanchayan.INBOX:check_status()
    -- sanchayan['[Gmail]/Trash']:check_status()
    -- sanchayan['[Gmail]/Spam']:check_status()
    mails = sanchayan.INBOX:select_all()
    move_mailing_lists(sanchayan, mails)
	mails = sanchayan.Sent:select_all()
    move_mailing_lists(sanchayan, mails)
    mails = sanchayan['[Gmail]/Trash']:select_all()
	imap_trash = sanchayan['Trash']:select_all()
	move_to_gmail_trash(sanchayan, imap_trash, '[Gmail]/Trash')
	delete_from_trash(sanchayan, mails)
    mails = sanchayan['[Gmail]/Spam']:select_all()
    move_mailing_lists(sanchayan, mails)
end

function move_mailing_lists(account, mails)
    move_if_to_contains(account, mails, "gstreamer-devel@lists.freedesktop.org", "gstreamer")
    move_if_from_contains(account, mails, "gstreamer-devel@lists.freedesktop.org", "gstreamer")
    move_if_cc_contains(account, mails, "gstreamer-devel@lists.freedesktop.org", "gstreamer")
    move_if_to_contains(account, mails, "gstreamer-embedded@lists.freedesktop.org", "gstreamer")
    move_if_from_contains(account, mails, "gstreamer-embedded@lists.freedesktop.org", "gstreamer")
    move_if_cc_contains(account, mails, "gstreamer-embedded@lists.freedesktop.org", "gstreamer")
    move_if_to_contains(account, mails, "pulseaudio-discuss@lists.freedesktop.org", "pulseaudio")
    move_if_from_contains(account, mails, "pulseaudio-discuss@lists.freedesktop.org", "pulseaudio")
    move_if_cc_contains(account, mails, "pulseaudio-discuss@lists.freedesktop.org", "pulseaudio")

    -- Bluetooth
    move_if_to_contains(account, mails, "linux-bluetooth@vger.kernel.org", "bluez")
    move_if_from_contains(account, mails, "linux-bluetooth@vger.kernel.org", "bluez")
    move_if_cc_contains(account, mails, "linux-bluetooth@vger.kernel.org", "bluez")

    -- Linux Kernel
    move_if_to_contains(account, mails, "lists.infradead.org", "Linux Kernel")
    move_if_from_contains(account, mails, "lists.infradead.org", "Linux Kernel")
    move_if_cc_contains(account, mails, "lists.infradead.org", "Linux Kernel")
    move_if_to_contains(account, mails, "vger.kernel.org", "Linux Kernel")
    move_if_from_contains(account, mails, "vger.kernel.org", "Linux Kernel")
	move_if_cc_contains(account, mails, "vger.kernel.org", "Linux Kernel")

    -- U boot
    move_if_to_contains(account, mails, "u-boot@lists.denx.de", "Uboot")
    move_if_from_contains(account, mails, "u-boot@lists.denx.de", "Uboot")
	move_if_cc_contains(account, mails, "u-boot@lists.denx.de", "Uboot")

	-- Jobs
    move_if_from_contains(account, mails, "monster.com","Jobs")
	move_if_from_contains(account, mails, "naukri.com","Jobs")

    move_if_to_contains(account, mails, "gitlab@gitlab.freedesktop.org", "FreedesktopGitlab")
    move_if_from_contains(account, mails, "gitlab@gitlab.freedesktop.org", "FreedesktopGitlab")

    -- IETF
    move_if_to_contains(account, mails, "ietf.org", "ietf")
    move_if_from_contains(account, mails, "ietf.org", "ietf")
    move_if_cc_contains(account, mails, "ietf.org", "ietf")
end

function move_if_subject_contains(account, mails, subject, mailbox)
    filtered = mails:contain_subject(subject)
    filtered:move_messages(account[mailbox]);
end

function move_if_to_contains(account, mails, to, mailbox)
    filtered = mails:contain_to(to)
    filtered:move_messages(account[mailbox]);
end

function move_if_from_contains(account, mails, from, mailbox)
    filtered = mails:contain_from(from)
    filtered:move_messages(account[mailbox]);
end

function move_if_cc_contains(account, mails, cc, mailbox)
    filtered = mails:contain_cc(cc)
    filtered:move_messages(account[mailbox]);
end

function move_to_gmail_trash(account, mails, mailbox)
   filtered = mails:select_all()
   filtered:move_messages(account[mailbox])
end

function delete_mail_from(account, mails, from)
    filtered = mails:contain_from(from)
    filtered:delete_messages()
end

function delete_mail_if_subject_contains(account, mails, subject)
    filtered = mails:contain_subject(subject)
    filtered:delete_messages()
end

function delete_from_trash(account, mails)
   filtered = mails:select_all()
   filtered:delete_messages()
end

-- Utility function to get IMAP password from file
function get_imap_password(file)
    local home = os.getenv("HOME")
    local file = home .. "/" .. file
    local str = io.open(file):read()
    return str;
end

function get_pwd_fastmail()
    local cmd = "pass show apppass/fastmail"
    local fd = io.popen(cmd, 'r')
    pass = fd:read("*a")
    fd:close()
    return pass;
end

function get_pwd_sanchayan()
    local cmd = "pass show apppass/sanchayan"
    local fd = io.popen(cmd, 'r')
    pass = fd:read("*a")
    fd:close()
    return pass;
end

main() -- Call the main function
