import Ink

struct MarkdownImageProcessor: MarkdownProcessor {

    static var modifier: Modifier.Target = .images

    private let content: Content

    private let results: PageGenerationResults

    private let language: ContentLanguage

    private let commands: [CommandType : CommandProcessor]

    init(content: Content, results: PageGenerationResults, language: ContentLanguage) {
        self.content = content
        self.results = results
        self.language = language

        self.commands = CommandType.allCases.reduce(into: [:]) { commands, command in
            commands[command] = command.processor.init(content: content, results: results, language: language)
        }
    }

    var html: HtmlCommand {
        commands[.includedHtml] as! HtmlCommand
    }

    func process(html: String, markdown: Substring) -> String {
        let argumentList = markdown.between(first: "](", andLast: ")").percentDecoded()
        let arguments = argumentList.components(separatedBy: ";")

        let rawCommand = markdown.between("![", and: "]").trimmed.percentDecoded()
        guard rawCommand != "" else {
            return commands[.image]!.process(arguments, markdown: markdown)
        }

        guard let command = CommandType(rawValue: rawCommand) else {
            // Treat unknown commands as normal links
            results.invalid(command: nil, markdown)
            return html
        }
        return commands[command]!.process(arguments, markdown: markdown)
    }
}
