//
//  TitlebarView.swift
//  SBrowser
//
//  Created by James Magahern on 7/29/20.
//

import UIKit

class SecurityIndicatorView: UIView
{
    let imageView = UIImageView(image: UIImage(systemName: "lock.fill"))
    let label = UILabel(frame: .zero)
    
    var labelVisible: Bool = true { didSet { setNeedsLayout() } }
    
    private let imageViewPadding = CGFloat(3.0)
    
    convenience init() {
        self.init(frame: .zero)
        
        addSubview(imageView)
        addSubview(label)
        
        label.text = "Secure Connection"
        imageView.contentMode = .scaleAspectFit
    }
    
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var size = CGSize(width: imageView.intrinsicContentSize.width, height: size.height)
        if labelVisible {
            size.width += label.sizeThatFits(size).width + imageViewPadding
        }
        
        return size
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        imageView.frame = CGRect(x: 0, y: 0, width: bounds.height, height: bounds.height)
        if labelVisible {
            label.isHidden = false
            label.frame = CGRect(x: imageView.frame.maxX + imageViewPadding, y: 1.0, width: bounds.width - (imageView.frame.maxX + imageViewPadding), height: bounds.height)
        } else {
            label.isHidden = true
        }
    }
}

class TitlebarView: UIView
{
    public var showsSecurityIndicator: Bool = false { didSet { setNeedsLayout() } }
    
    private let titleLabelView = UILabel(frame: .zero)
    private let backgroundView = GradientView(direction: .horizontal, colors: [
        UIColor(red: 0.101, green: 0.176, blue: 0.415, alpha: 1.0),
        UIColor(red: 0.153, green: 0.000, blue: 0.153, alpha: 1.0)
    ])
    
    private let separatorView = UIView(frame: .zero)
    private let securityIndicatorView = SecurityIndicatorView()
        
    convenience init() {
        self.init(frame: .zero)
        addSubview(backgroundView)
        addSubview(titleLabelView)
        addSubview(securityIndicatorView)
        addSubview(separatorView)
        
        separatorView.backgroundColor = UIColor(white: 1.0, alpha: 0.20)
        separatorView.layer.compositingFilter = "kCAFilterPlusL"
        
        titleLabelView.textColor = .white
        titleLabelView.layer.shadowColor = UIColor.black.cgColor
        titleLabelView.layer.shadowRadius = 0.0
        titleLabelView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
        titleLabelView.font = UIFont.boldSystemFont(ofSize: 12.0)
        
        let securityIndicatorLabelColor = UIColor(white: 1.0, alpha: 0.7)
        securityIndicatorView.imageView.tintColor = securityIndicatorLabelColor
        securityIndicatorView.label.textColor = securityIndicatorLabelColor
        securityIndicatorView.label.font = UIFont.systemFont(ofSize: 10.0)
        
        backgroundView.alpha = 0.98
        
        // Make draggable
        if #available(iOS 17.0, *) {
            addInteraction(UIWindowSceneDragInteraction())
        }
    }
    
    func setTitle(_ title: String) {
        let titleAttributes: [NSAttributedString.Key : Any] = [
            .font : UIFont.boldSystemFont(ofSize: 12.0),
            .foregroundColor : UIColor.white
        ]
        
        let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
        let appNameAttributes: [NSAttributedString.Key : Any] = [
            .font : UIFont.systemFont(ofSize: 12.0),
            .foregroundColor : UIColor(white: 1.0, alpha: 0.75)
        ]
        
        if title.count > 0 {
            let attributedString = NSMutableAttributedString(string: title, attributes: titleAttributes)
            let appAttributedString = NSAttributedString(string: " :: \(appName)", attributes: appNameAttributes)
            attributedString.append(appAttributedString)
            
            titleLabelView.attributedText = attributedString
        } else {
            titleLabelView.attributedText = NSAttributedString(string: appName, attributes: titleAttributes)
        }
    }
    
    func setColorTheme(_ colorTheme: [UIColor]) {
        backgroundView.colors = colorTheme
    }
        
    override func layoutSubviews() {
        super.layoutSubviews()
        
        let edgePadding: CGFloat = 8.0
        
        securityIndicatorView.labelVisible = false
        
        var securityIndicatorSize = showsSecurityIndicator ? securityIndicatorView.sizeThatFits(bounds.size) : .zero
        securityIndicatorSize.height = 10.0
        
        backgroundView.frame = bounds
        titleLabelView.frame = bounds
            .avoiding(verticalInsets: safeAreaInsets)
            .insetBy(dx: edgePadding + layoutMargins.left, dy: 0.0)
            .subtracting(width: securityIndicatorSize.width, height: 0)
        
        if showsSecurityIndicator {
            securityIndicatorView.isHidden = false
            securityIndicatorView.frame = CGRect(
                origin: CGPoint(x: edgePadding + layoutMargins.left, y: 0.0),
                size: CGSize(width: securityIndicatorSize.height, height: securityIndicatorSize.height)
            )
            
            // Scooch the title over a bit
            titleLabelView.frame.origin.x = securityIndicatorView.frame.maxX + 4.0
        
            securityIndicatorView.frame = securityIndicatorView.frame.centeredY(inRect: titleLabelView.frame)
        } else {
            securityIndicatorView.isHidden = true
        }
        
        let separatorHeight = 1.0 / UIScreen.main.scale
        separatorView.frame = CGRect(x: 0, y: bounds.height - separatorHeight, width: bounds.width, height: separatorHeight)
    }
}
