/*
 * Copyright (c) 2006-2014 DMDirc Developers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.commandparser.commands.channel;

import com.dmdirc.Channel;
import com.dmdirc.FrameContainer;
import com.dmdirc.commandparser.BaseCommandInfo;
import com.dmdirc.commandparser.CommandArguments;
import com.dmdirc.commandparser.CommandInfo;
import com.dmdirc.commandparser.CommandType;
import com.dmdirc.commandparser.commands.Command;
import com.dmdirc.commandparser.commands.CommandOptions;
import com.dmdirc.commandparser.commands.ExternalCommand;
import com.dmdirc.commandparser.commands.context.ChannelCommandContext;
import com.dmdirc.commandparser.commands.context.CommandContext;
import com.dmdirc.interfaces.CommandController;
import com.dmdirc.interfaces.Connection;
import com.dmdirc.parser.interfaces.ChannelInfo;

import javax.annotation.Nonnull;
import javax.inject.Inject;

/**
 * The show topic command shows the user the current topic.
 */
@CommandOptions(allowOffline = false)
public class ShowTopic extends Command implements ExternalCommand {

    /** A command info object for this command. */
    public static final CommandInfo INFO = new BaseCommandInfo("topic",
            "topic - displays the current topic\ntopic <newtopic> - sets the channel topic",
            CommandType.TYPE_CHANNEL);

    /**
     * Creates a new instance of this command.
     *
     * @param controller The controller to use for command information.
     */
    @Inject
    public ShowTopic(final CommandController controller) {
        super(controller);
    }

    @Override
    public void execute(@Nonnull final FrameContainer origin,
            final CommandArguments args, final CommandContext context) {
        final Channel channel = ((ChannelCommandContext) context).getChannel();
        if (args.getArguments().length == 0) {
            final ChannelInfo cChannel = channel.getChannelInfo();

            if (cChannel.getTopic().isEmpty()) {
                sendLine(origin, args.isSilent(), "channelNoTopic", cChannel);
            } else {
                final String[] parts = channel.getConnection().get().parseHostmask(
                        cChannel.getTopicSetter());

                sendLine(origin, args.isSilent(), "channelTopicDiscovered",
                        "", parts[0], parts[1], parts[2], cChannel.getTopic(),
                        1000 * cChannel.getTopicTime(), cChannel);
            }
        } else {
            channel.setTopic(args.getArgumentsAsString());
        }
    }

    @Override
    public void execute(final FrameContainer origin, final Connection connection,
            final String channel, final boolean isSilent, final CommandArguments args) {
        if (args.getArguments().length == 0) {
            connection.getParser().get().sendRawMessage("TOPIC " + channel);
        } else {
            connection.getParser().get().sendRawMessage("TOPIC " + channel + " :" + args.
                    getArgumentsAsString());
        }
    }

}

@@ -1230,24 +1230,49 @@
 eContainer;%0A
+import com.dmdirc.Topic;%0A
 import com.d
@@ -1857,23 +1857,16 @@
 .dmdirc.
-parser.
 interfac
@@ -1868,27 +1868,48 @@
 erfaces.
-ChannelInfo
+User;%0A%0Aimport java.util.Optional
 ;%0A%0Aimpor
@@ -2941,28 +2941,29 @@
 nal 
-ChannelInfo cChannel
+Optional%3CTopic%3E topic
  = c
@@ -2977,23 +2977,23 @@
 getC
-hannelInfo
+urrentTopic
 ();%0A
-%0A
     
@@ -3008,40 +3008,101 @@
 if (
-cChannel.getTopic().isEmpty()) %7B
+topic.isPresent()) %7B%0A                final Optional%3CUser%3E user = topic.map(Topic::getClient);
 %0A   
@@ -3160,323 +3160,382 @@
 nnel
-No
 Topic
-%22, cChannel);%0A            %7D else %7B%0A                final String%5B%5D parts = channel.getConnection().get().parseHostmask(%0A                        cChannel.getTopicSetter());%0A%0A                sendLine(origin, args.isSilent(), %22channelTopicDiscovered%22,%0A                        %22%22, parts%5B0%5D, parts%5B1%5D, parts%5B2%5D,
+Discovered%22, %22%22,%0A                        user.map(User::getNickname).orElse(%22%22),%0A                        user.flatMap(User::getUsername).orElse(%22%22),%0A                        user.flatMap(User::getHostname).orElse(%22%22),%0A                        topic.map(Topic::getTopic).orElse(%22%22),%0A                        1000 * topic.map(Topic::getTime).get(),%0A                       
  c
-C
 hann
@@ -3544,16 +3544,16 @@
 .get
-Topic(),
+Name());
 %0A   
@@ -3553,33 +3553,41 @@
 ));%0A            
- 
+%7D else %7B%0A
            1000 
@@ -3585,48 +3585,82 @@
     
-1000 * cC
+     sendLine(origin, args.isSilent(), %22c
 hannel
-.get
+No
 Topic
-Time()
+%22
 , c
-C
 hannel
+.getName()
 );%0A 

Make ShowTopic less pathological.