package allen.town.podcast.parser.feed.namespace;

import android.text.TextUtils;
import android.util.Log;

import androidx.core.text.HtmlCompat;

import allen.town.podcast.parser.feed.HandlerState;
import allen.town.podcast.parser.feed.element.SyndElement;
import allen.town.podcast.parser.feed.util.DurationParser;
import org.xml.sax.Attributes;


public class Itunes extends Namespace {

    public static final String NSTAG = "itunes";
    public static final String NSURI = "http://www.itunes.com/dtds/podcast-1.0.dtd";

    private static final String IMAGE = "image";
    private static final String IMAGE_HREF = "href";

    private static final String AUTHOR = "author";
    public static final String DURATION = "duration";
    private static final String SUBTITLE = "subtitle";
    private static final String SUMMARY = "summary";
    private static final String NEW_FEED_URL = "new-feed-url";

    @Override
    public SyndElement handleElementStart(String localName, HandlerState state,
                                          Attributes attributes) {
        if (IMAGE.equals(localName)) {
            String url = attributes.getValue(IMAGE_HREF);

            if (state.getCurrentItem() != null) {
                state.getCurrentItem().setImageUrl(url);
            } else {
                // this is the feed image
                // prefer to all other images
                if (!TextUtils.isEmpty(url)) {
                    state.getFeed().setImageUrl(url);
                }
            }
        }
        return new SyndElement(localName, this);
    }

    @Override
    public void handleElementEnd(String localName, HandlerState state) {
        if (state.getContentBuf() == null) {
            return;
        }

        String content = state.getContentBuf().toString();
        String contentFromHtml = HtmlCompat.fromHtml(content, HtmlCompat.FROM_HTML_MODE_COMPACT).toString();
        if (TextUtils.isEmpty(content)) {
            return;
        }

        if (AUTHOR.equals(localName) && state.getFeed() != null && state.getTagstack().size() <= 3) {
            state.getFeed().setAuthor(contentFromHtml);
        } else if (DURATION.equals(localName)) {
            try {
                long durationMs = DurationParser.inMillis(content);
                state.getTempObjects().put(DURATION, (int) durationMs);
            } catch (NumberFormatException e) {
                Log.e(NSTAG, String.format("Duration '%s' could not be parsed", content));
            }
        } else if (SUBTITLE.equals(localName)) {
            if (state.getCurrentItem() != null && TextUtils.isEmpty(state.getCurrentItem().getDescription())) {
                state.getCurrentItem().setDescriptionIfLonger(content);
            } else if (state.getFeed() != null && TextUtils.isEmpty(state.getFeed().getDescription())) {
                state.getFeed().setDescription(content);
            }
        } else if (SUMMARY.equals(localName)) {
            if (state.getCurrentItem() != null) {
                state.getCurrentItem().setDescriptionIfLonger(content);
            } else if (Rss20.CHANNEL.equals(state.getSecondTag().getName()) && state.getFeed() != null) {
                state.getFeed().setDescription(content);
            }
        } else if (NEW_FEED_URL.equals(localName) && content.trim().startsWith("http")) {
            state.redirectUrl = content.trim();
        }
    }
}
