package org.andresoviedo.google_drive_ftp_adapter.view.ftp;

import org.apache.ftpserver.command.AbstractCommand;
import org.apache.ftpserver.ftplet.FtpFile;
import org.apache.ftpserver.ftplet.FtpReply;
import org.apache.ftpserver.ftplet.FtpRequest;
import org.apache.ftpserver.impl.FtpIoSession;
import org.apache.ftpserver.impl.FtpServerContext;
import org.apache.ftpserver.impl.LocalizedFtpReply;
import org.apache.ftpserver.util.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.util.Date;

public class FtpCommands {
    public static class MFMT extends AbstractCommand {

        private final Logger LOG = LoggerFactory.getLogger(MFMT.class);

        /**
         * Execute command.
         */
        public void execute(final FtpIoSession session, final FtpServerContext context, final FtpRequest request) {

            // reset state variables
            session.resetState();

            String argument = request.getArgument();

            if (argument == null || argument.trim().length() == 0) {
                session.write(LocalizedFtpReply.translate(session, request, context,
                        FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, "MFMT.invalid", null));
                return;
            }

            String[] arguments = argument.split(" ", 2);

            if (arguments.length != 2) {
                session.write(LocalizedFtpReply.translate(session, request, context,
                        FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, "MFMT.invalid", null));
                return;
            }

            String timestamp = arguments[0].trim();

            try {

                Date time = DateUtils.parseFTPDate(timestamp);

                String fileName = arguments[1].trim();

                // get file object
                FtpFile file = null;

                try {
                    file = session.getFileSystemView().getFile(fileName);
                } catch (Exception ex) {
                    LOG.debug("Exception getting the file object: " + fileName, ex);
                }

                if (file == null || !file.doesExist()) {
                    session.write(LocalizedFtpReply.translate(session, request, context, FtpReply.REPLY_550_REQUESTED_ACTION_NOT_TAKEN,
                            "MFMT.filemissing", fileName));
                    return;
                }

                // INFO: We want folders also to be touched
                // // check file
                // if (!file.isFile()) {
                // session.write(LocalizedFtpReply
                // .translate(
                // session,
                // request,
                // context,
                // FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS,
                // "MFMT.invalid", null));
                // return;
                // }

                // check if we can set date and retrieve the actual date
                // stored
                // for the file.
                if (!file.setLastModified(time.getTime())) {
                    // we couldn't set the date, possibly the file was
                    // locked
                    session.write(LocalizedFtpReply.translate(session, request, context,
                            FtpReply.REPLY_450_REQUESTED_FILE_ACTION_NOT_TAKEN, "MFMT", fileName));
                    return;
                }

                // all checks okay, lets go
                session.write(LocalizedFtpReply.translate(session, request, context, FtpReply.REPLY_213_FILE_STATUS, "MFMT",
                        "ModifyTime=" + timestamp + "; " + fileName));

            } catch (ParseException e) {
                session.write(LocalizedFtpReply.translate(session, request, context,
                        FtpReply.REPLY_501_SYNTAX_ERROR_IN_PARAMETERS_OR_ARGUMENTS, "MFMT.invalid", null));
            }

        }
    }
}