//
/*
 * Copyright (c) 2023 BWI GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import Foundation
@objc class FederationIconHelper: NSObject {
    @objc static let shared = FederationIconHelper()
    
    // MARK: Federation pill with text
    
    // bwi: 5216 and 5204 - federation
    @objc func roomNameWithFederationPill(roomDisplayName: String?, font: UIFont) -> NSAttributedString? {
        guard let roomDisplayName = roomDisplayName else {
            return nil
        }
        
        let attributedString = NSMutableAttributedString(string: roomDisplayName + " ")
        
        // get the correct asset for the current theme and language
        let image: UIImage
        image = getFederationPillImage()
        
        // append the pill to the room name
        if image.size.width > 0.0 && image.size.height > 0.0 {
            let attachment = NSTextAttachment()
            attachment.image = image
            attachment.bounds = calculateFederationPillBounds(image:image, pillHeight: CGFloat(20.0), font: font)
            attributedString.append(NSAttributedString(attachment: attachment))
        }
        
        return attributedString
    }
    
    // #5226 us12 add federation pill to navigationViewTitle
    @objc func getRoomFederationPillView(textView: UITextField) -> UIView {
        if let font = textView.font {
            let image = getFederationPillImage()
            if image.size.width > 0.0 && image.size.height > 0.0 {
                let imageView = UIImageView(frame: calculateFederationPillBounds(image: image, pillHeight: textView.frame.size.height, font: font))
                imageView.contentMode = .center
                imageView.clipsToBounds = true
                let view = UIView()
                view.bounds = calculateFederationPillBounds(image: image, pillHeight: textView.frame.size.height, font: font)
                view.addSubview(imageView)
                imageView.image = image
                return view
            } else {
                return UIView()
            }
        } else {
            return UIView()
        }
    }
    
    @objc func getFederationPillImage() -> UIImage {
        // get the correct asset for the current theme and language
        let image: UIImage
        if Locale.current.languageCode == "de" {
            image = ThemeService.shared().isCurrentThemeDark() ? Asset.Images.federationPillDeBumDark.image : Asset.Images.federationPillDeBumLight.image
        } else {
            image = ThemeService.shared().isCurrentThemeDark() ? Asset.Images.federationPillEnBumDark.image : Asset.Images.federationPillEnBumLight.image
        }
        
        return image
    }
    
    private func calculateFederationPillBounds(image: UIImage, pillHeight: CGFloat, font: UIFont) -> CGRect
    {
        let aspectRatio = image.size.width / image.size.height
        let offset = 0.5 * (font.capHeight - pillHeight)
        return CGRect(x: 0, y: offset, width: pillHeight * aspectRatio, height: pillHeight)
    }
    
    // MARK: Federation icon
    
    // Calculate the size and position of the federated pill for an avatar ImageView
    @objc func getFederatedIconImageView(avatarFrame: CGRect) -> UIImageView {
        // because of svg we use fixed values here for the raw image size
        let pillImageWidth: CGFloat = 23.0
        let pillImageHeight: CGFloat = 18.0
        let pillBorderSize: CGFloat = 3.0
        
        // compensation for the bottom gap in the asset
        let verticalShift: CGFloat = ((avatarFrame.size.height * 0.34) / pillImageHeight) * 1.5
        
        let avatarSize = avatarFrame.size.height
        let pillHeight: CGFloat = avatarSize * 0.34   // 34% relative size by design rule
        let pillWidth: CGFloat = pillHeight / pillImageHeight * pillImageWidth
        let scaledBorderSize: CGFloat = pillBorderSize * pillHeight / pillImageHeight
        let frame = CGRect(x: avatarFrame.origin.x + avatarSize - pillWidth + scaledBorderSize, y: verticalShift + avatarFrame.origin.y + avatarSize - pillHeight, width: pillWidth, height: pillHeight)
        return UIImageView(frame: frame)
    }
    
    @objc func federationBadgeImage() -> UIImage {
        if ThemeService.shared().isCurrentThemeDark() {
            return Asset.Images.roomFederatedBumIconDark.image
        } else {
            return Asset.Images.roomFederatedBumIconLight.image
        }
    }
}
