import Foundation
import GenAPI
import Localization
import SwiftUI

// MARK: - LocalString
public struct LocalString: Codable, Equatable {
    public let text: String
    public let color: String?

    public init(text: String = "", color: String? = nil) {
        self.text = text
        self.color = color
    }
}

// MARK: - ModalTag
public struct ModalTag: Codable, Equatable {
    public let text: LocalString
    public let color: String

    public init(text: LocalString, color: String) {
        self.text = text
        self.color = color
    }
}

// MARK: - ModalCTA
public struct ModalCTA: Codable, Equatable {
    public let text: LocalString
    public let color: String
    public let url: String
    public let icon: String?

    public init(
        text: LocalString,
        color: String,
        url: String,
        icon: String? = nil
    ) {
        self.text = text
        self.color = color
        self.url = url
        self.icon = icon
    }
}

// MARK: - Modal
public struct Modal: Codable, Equatable, Identifiable {
    public let id: String
    public let order: Int

    // Background
    public let heroBackgroundImageUrl: String?
    public let heroBackgroundImageUrlMobile: String?
    public let heroBackgroundColor: String?

    // Tag (top left badge)
    public let tag: ModalTag?

    // Text content
    public let titleText: LocalString
    public let subtitleText: LocalString

    // CTA
    public let primaryCta: ModalCTA?

    enum CodingKeys: String, CodingKey {
        case id
        case order
        case heroBackgroundImageUrl = "hero_background_img_url"
        case heroBackgroundImageUrlMobile = "hero_background_img_url_mobile"
        case heroBackgroundColor = "hero_background_color"
        case tag
        case titleText = "title_text"
        case subtitleText = "subtitle_text"
        case primaryCta = "primary_cta"
    }

    public init(
        id: String,
        order: Int,
        heroBackgroundImageUrl: String? = nil,
        heroBackgroundImageUrlMobile: String? = nil,
        heroBackgroundColor: String? = nil,
        tag: ModalTag? = nil,
        titleText: LocalString,
        subtitleText: LocalString,
        primaryCta: ModalCTA? = nil
    ) {
        self.id = id
        self.order = order
        self.heroBackgroundImageUrl = heroBackgroundImageUrl
        self.heroBackgroundImageUrlMobile = heroBackgroundImageUrlMobile
        self.heroBackgroundColor = heroBackgroundColor
        self.tag = tag
        self.titleText = titleText
        self.subtitleText = subtitleText
        self.primaryCta = primaryCta
    }
}

// MARK: - ModalsResponse
public struct ModalsResponse: Codable {
    public let modals: [Modal]
}

// MARK: - API Mapping

public extension LocalString {
    init(_ remote: GenAPI.LocalStringSchema) {
        self.text = remote.text ?? ""
        self.color = remote.color
    }
}

public extension ModalTag {
    init(_ remote: GenAPI.ModalsTagSchema) {
        self.text = LocalString(remote.text ?? GenAPI.LocalStringSchema())
        self.color = remote.color ?? ""
    }
}

public extension ModalCTA {
    init(_ remote: GenAPI.ModalsCtaSchema) {
        self.text = LocalString(remote.text ?? GenAPI.LocalStringSchema())
        self.color = remote.color ?? ""
        self.url = remote.url ?? ""
        self.icon = remote.icon
    }
}

public extension Modal {
    init(_ remote: GenAPI.ModalsGraphicSchema) throws {
        guard let id = remote.id else {
            throw ModalError.missingRequiredField("id")
        }

        self.id = id
        self.order = remote.order ?? 0
        self.heroBackgroundImageUrl = remote.heroBackgroundImgUrl
        self.heroBackgroundImageUrlMobile = remote.heroBackgroundImgUrlMobile
        self.heroBackgroundColor = remote.heroBackgroundColor
        self.tag = remote.tag.map { ModalTag($0) }
        self.titleText = LocalString(remote.titleText ?? GenAPI.LocalStringSchema())
        self.subtitleText = LocalString(remote.subtitleText ?? GenAPI.LocalStringSchema())
        self.primaryCta = remote.primaryCta.map { ModalCTA($0) }
    }
}

private enum ModalError: Error {
    case missingRequiredField(String)
}
